复制文件任务

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018

使用此任务可以使用匹配模式将文件从源文件夹复制到目标文件夹。

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

需求

None

YAML 代码片段

# Copy files
# Copy files from a source folder to a target folder using patterns matching file paths (not folder paths)
- task: CopyFiles@2
  inputs:
    #sourceFolder: # Optional
    #contents: '**' 
    targetFolder: 
    #cleanTargetFolder: false # Optional
    #overWrite: false # Optional
    #flattenFolders: false # Optional
    #preserveTimestamp: false # Optional
    #retryCount: 0 # Optional
    #ignoreMakeDirErrors: false # Optional

参数

参数 说明
SourceFolder
源文件夹
(包含要复制的文件的可选) 文件夹。 如果将其留空,则从存储库的根文件夹执行复制 (与指定 $(Build.SourcesDirectory)) 相同。
如果生成在源目录之外生成项目,请指定 $(Agent.BuildDirectory) 从为管道创建的目录中复制文件。
Contents
目录
(必需) 文件路径作为副本的一部分包含。 支持多行匹配模式。
例如:
  • * 复制指定源文件夹中的所有文件
  • ** 复制指定源文件夹中的所有文件以及所有子文件夹中的所有文件
  • **\bin\** 以递归方式从任何 bin 文件夹中复制所有文件

    该模式仅用于匹配文件路径,而不是文件夹路径。 因此,应指定模式,例如 **\bin\** 而不是 **\bin。
    必须使用与生成代理类型匹配的路径分隔符。 例如, /必须用于 Linux 代理。 下面显示了更多示例。
    默认值:30**
TargetFolder
目标文件夹
(目标文件夹或 UNC 路径文件将复制到所需的) 。 可以使用 变量
示例: $ (build.artifactstagingdirectory)
CleanTargetFolder
清理目标文件夹
(可选) 复制前删除目标文件夹中的所有现有文件
默认值:30false
OverWrite
Overwrite
(可选) 替换目标文件夹中的现有文件
默认值:30false
flattenFolders
平展文件夹
(可选) 平展文件夹结构并将所有文件复制到指定的目标文件夹中
默认值:30false
preserveTimestamp
保留目标时间戳
(可选) 使用原始源文件,保留目标文件时间戳。
默认值:30false
retryCount
重试计数以复制文件
(可选) 指定要复制文件的重试计数。 它可能有助于解决间歇性问题,例如远程主机上的 UNC 目标路径。
默认值:300
ignoreMakeDirErrors
在创建目标文件夹期间忽略错误
(可选) 这可能有助于避免多个具有一个目标文件夹的代理并行执行任务的问题。
默认值:30false

注释

如果没有匹配文件,该任务仍将报告成功。 如果目标文件夹中已存在匹配的文件,则任务将报告警告并继续执行,除非 Overwrite 参数设置为 true。

示例

steps:
- task: CopyFiles@2
  inputs:
    contents: '_buildOutput/**'
    targetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: $(Build.ArtifactStagingDirectory)
    artifactName: MyBuildOutputs

示例

复制可执行文件和自述文件

目标

只需复制自述文件以及运行此 C# 控制台应用所需的文件:

`-- ConsoleApplication1
    |-- ConsoleApplication1.sln
    |-- readme.txt
    `-- ClassLibrary1
        |-- ClassLibrary1.csproj
    `-- ClassLibrary2
        |-- ClassLibrary2.csproj
    `-- ConsoleApplication1
        |-- ConsoleApplication1.csproj

注意

ConsoleApplication1.sln 包含包含.dll和.exe文件的 bin 文件夹,请参阅下面的结果,了解移动的内容!

在“变量”选项卡上, $(BuildConfiguration) 设置为 release

具有多个匹配模式的示例:

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    Contents: |
      ConsoleApplication1\ConsoleApplication1\bin\**\*.exe
      ConsoleApplication1\ConsoleApplication1\bin\**\*.dll
      ConsoleApplication1\readme.txt
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

OR 条件的示例:

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    Contents: |
      ConsoleApplication1\ConsoleApplication1\bin\**\?(*.exe|*.dll)
      ConsoleApplication1\readme.txt
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

具有 NOT 条件的示例:

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    Contents: |
      ConsoleApplication1\**\bin\**\!(*.pdb|*.config)
      !ConsoleApplication1\**\ClassLibrary*\**
      ConsoleApplication1\readme.txt
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

内容部分中变量的示例

- task: CopyFiles@2
  inputs:
    Contents: '$(Build.Repository.LocalPath)/**' 
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

TFS 上尚不提供 YAML 版本。

结果

这些文件将复制到暂存目录:

`-- ConsoleApplication1
    |-- readme.txt
    `-- ConsoleApplication1
        `-- bin
            `-- Release
                | -- ClassLibrary1.dll
                | -- ClassLibrary2.dll
                | -- ConsoleApplication1.exe

从源目录复制除 .git 文件夹以外的所有内容

具有多个匹配模式的示例:

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)'
    Contents: |
      **/*
      !.git/**/*
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

TFS 上尚不提供 YAML 版本。

开源

此任务在 GitHub 上开放源代码。 欢迎提供反馈和建议。

常见问题解答

在哪里可以了解有关文件匹配模式的详细信息?

文件匹配模式参考

如何实现使用此任务发布项目?

请参阅 Azure Pipelines 中的项目

问:我在发布项目时遇到问题。 如何查看详细日志?

若要为管道启用详细日志,请执行以下操作:

  1. 编辑管道并选择 “变量”
  2. 使用名称和 System.Debug 值添加新变量 true
  3. 保存

问:哪些变量可供我使用?

答: $(Build.SourcesDirectory)$(Agent.BuildDirectory) 并且只是管道中使用的几个变量。 变量可用作 表达式 或脚本。

请参阅 “定义变量”、“ 预定义变量”和 “经典发布”和“项目”变量 ,了解不同类型的变量。

问:任务允许我在 yaml 管道中的部署作业中发布项目,但我无法在下游管道中使用它?

答:部署作业没有源分支的上下文,因此不适合发布项目。 它们主要用于使用项目。 解决方法是将该逻辑隔离为单独的作业 (,) 依赖于部署作业。

需要使用代理吗?

至少需要一个代理才能运行生成或发布。

我遇到了问题。 如何对其进行故障排除?

请查看排查生成和发布问题

我无法选择默认代理池,无法将生成或发布排队。 如何修复此问题?

请查看代理池

我的 NuGet 推送任务失败,出现“错误: 无法获取本地颁发者证书”错误。 如何解决此问题?

可通过添加受信任的根证书来解决此问题。 可将环境变量 NODE_EXTRA_CA_CERTS=file 添加到生成代理,也可在管道中添加任务变量 NODE.EXTRA.CA.CERTS=file。 有关此变量的更多详细信息,请参阅 Node.js 文档。 有关在管道中设置变量的说明,请参阅在管道中设置变量

我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?

其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。