我正在使用VSTS作为构建服务器,并且在构建时我想将bin文件夹内容复制到目标的根目录,以及将另一个文件夹中的自定义文件复制到此目标。 MSDN建议我使用迷你匹配模式,但它使用子目录结构复制文件。我对恢复结构不感兴趣。
例如,我正在获取此文件夹结构:
Project
MyProjectFiles
bin
x86 (it's build configuration)
Project.exe
Other project files
Project.sln
SomeScrips
script1.ps1
但我希望收到这个文件夹结构:
Project.exe
SomeScripts
script.ps1
我可以根据我的要求使用哪种迷你匹配模式?
答案 0 :(得分:24)
如果只想复制没有文件夹结构的文件,则需要指定复制根目录。由于project.exe与script.ps1文件位于不同的路径,因此您需要将它们复制到不同的复制任务中。
按照以下步骤操作:
答案 1 :(得分:7)
"展平文件夹"选项"高级" "复制文件"步骤
如果您正在使用TFS Online(Visual Studio Online)并且不需要复制文件夹结构,请使用" Flatten Folders"选项"高级" "复制文件"进入构建定义
答案 2 :(得分:4)
使用新的基于Web的构建系统,您可以在一个步骤中使用多个模式。因此,您可以针对您的情况执行类似的操作:
Project\bin\x86\Release\project.exe
SomeScripts\**\*
或者,如果您在构建步骤中使用了变量(例如BuildPlatform
/ BuildConfiguration
)中的构建平台和配置,则可以在模式中使用它们:
Project\bin\$(BuildPlatform)\$(BuildConfiguration)\project.exe
SomeScripts\**\*
如果您希望project.exe
位于根目录而不是结构中,则需要先使用Copy Task
将文件暂存到所需的结构中。您可以使用$(Build.StagingDirectory)
作为目标。然后使用$(Build.StagingDirectory)
的发布任务作为副本根,并将所有内容从此根发布到drop。
答案 3 :(得分:2)
对于那些希望在构建服务器中使用PowerShell脚本的人来说,这是一个工作(至少在我的构建服务器上;))示例:
param
(
[string] $buildConfiguration = "Debug",
[string] $outputFolder = $PSScriptRoot + "\[BuildOutput]\"
)
Write-Output "Copying all build output to folder '$outputFolder'..."
$includeWildcards = @("*.dll","*.exe","*.pdb","*.sql")
$excludeWildcards = @("*.vshost.*")
# create target folder if not existing, or, delete all files if existing
if(-not (Test-Path -LiteralPath $outputFolder)) {
New-Item -ItemType Directory -Force -Path $outputFolder | Out-Null
# exit if target folder (still) does not exist
if(-not (Test-Path -LiteralPath $outputFolder)) {
Write-Error "Output folder '$outputFolder' could not be created."
Exit 1
}
} else {
Get-ChildItem -LiteralPath $outputFolder -Include * -Recurse -File | foreach {
$_.Delete()
}
Get-ChildItem -LiteralPath $outputFolder -Include * -Recurse -Directory | foreach {
$_.Delete()
}
}
# find all output files (only when in their own project directory)
$files = @(Get-ChildItem ".\" -Include $includeWildcards -Recurse -File |
Where-Object {(
$_.DirectoryName -inotmatch '\\obj\\' -and
$_.DirectoryName -inotmatch '\\*Test*\\' -and
$_.DirectoryName -ilike "*\" + $_.BaseName + "\*" -and
$_.DirectoryName -ilike "*\" + $buildConfiguration
)}
)
# copy output files (overwrite if destination already exists)
foreach ($file in $files) {
Write-Output ("Copying: " + $file.FullName)
Copy-Item $file.FullName $outputFolder -Force
# copy all dependencies from folder (also in subfolders) to output folder as well (if not existing already)
$dependencies = Get-ChildItem $file.DirectoryName -Include $includeWildcards -Exclude $excludeWildcards -Recurse -File
foreach ($dependency in $dependencies) {
$dependencyRelativePathAndFilename = $dependency.FullName.Replace($file.DirectoryName, "")
$destinationFileName = Join-Path -Path $outputFolder -ChildPath $dependencyRelativePathAndFilename
if (-not(Test-Path -LiteralPath $destinationFileName)) {
Write-Output ("Copying: " + $dependencyRelativePathAndFilename + " => " + $destinationFileName)
# create sub directory if not exists
$destinationDirectory = Split-Path $destinationFileName -Parent
if (-not(Test-Path -LiteralPath $destinationDirectory)) {
New-Item -Type Directory $destinationDirectory
}
Copy-Item $dependency.FullName $destinationDirectory
} else {
Write-Debug ("Ignoring (existing destination): " + $dependency.FullName)
}
}
}
以下是PowerShell构建步骤中使用的脚本:
答案 4 :(得分:1)
“ flattenFolders”选项也可用作YAML任务参数。以下代码摘录显示了一个CopyFiles @ 2任务,该任务将构建输出复制到$(Build.ArtifactStagingDirectory)。当我指定选项flattenFolders: true
时,嵌套文件夹结构bin\release\...\My.exe
被展平,这意味着exe文件被复制到$(Build.ArtifactStagingDirectory)的根目录。
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
SourceFolder: '$(system.defaultworkingdirectory)'
Contents: |
**\bin\$(BuildConfiguration)\**\*.exe
TargetFolder: '$(Build.ArtifactStagingDirectory)'
flattenFolders: true
有关CopyFiles任务的其他文档可以在这里找到: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/copy-files?view=vsts&tabs=yaml
答案 5 :(得分:0)
制作要复制的每个文件的工件。然后为这些工件的每个文件创建一个“复制文件”任务。然后它不会复制源树结构。
答案 6 :(得分:0)
使用 TFS2017update1 及以上, VSTS ,您只需检查Copy Files Task中高级选项下的拼合文件夹即可。现在最简单的解决方案。
这会使文件夹结构变平并将所有文件复制到 指定的目标文件夹。