Скопируйте один файл в целевой каталог при развертывании из служб визуальной студии
Я использую VSTS в качестве сервера сборки, и при создании я хочу скопировать содержимое папки bin в корень целевой страницы, а также настраиваемые файлы из другой папки в эту цель. MSDN предлагает использовать шаблон минимизации, но он копирует файлы с помощью структуры подкаталога. Я не заинтересован в восстановлении структуры.
Например, я получаю эту структуру папок:
Project
MyProjectFiles
bin
x86 (it build configuration)
Project.exe
Other project files
Project.sln
SomeScrips
script1.ps1
Но я хочу получить эту структуру папок:
Project.exe
SomeScripts
script.ps1
Какой шаблон минимализации можно использовать для моих требований?
Ответы
Ответ 1
С помощью новой веб-системы построения вы можете использовать несколько шаблонов за один шаг. Поэтому вы можете сделать что-то подобное для вашего случая:
Project\bin\x86\Release\project.exe
SomeScripts\**\*
Или, если у вас есть платформа сборки и конфигурация в переменной (например. BuildPlatform
/BuildConfiguration
), которую вы также используете на этапе сборки, вы можете использовать их в шаблоне:
Project\bin\$(BuildPlatform)\$(BuildConfiguration)\project.exe
SomeScripts\**\*
Если вы хотите, чтобы project.exe
находился в корне, а не в структуре, вам нужно использовать Copy Task
, чтобы сначала сфабриковать ваши файлы в нужной структуре. Вы можете использовать $(Build.StagingDirectory)
как цель для этого. Затем используйте задачу "Опубликовать" с $(Build.StagingDirectory)
в качестве корня копирования и опубликуйте все, начиная от этого корня и заканчивая записью.
Ответ 2
Вам нужно указать корень копирования, если вы хотите копировать файлы только без структуры папок. Поскольку project.exe находится в другом пути с файлом script.ps1, вам необходимо скопировать их в другую задачу копирования.
Следуя приведенным ниже инструкциям:
- Добавьте копию "Копировать файлы", чтобы скопировать "project.exe". Настройки, как показано ниже:
![введите описание изображения здесь]()
- Добавьте "Скопировать файлы", чтобы скопировать папку "SomeScripts". Настройки, как показано ниже:
![введите описание изображения здесь]()
- Добавьте копию "Копировать и опубликовать сборку артефактов", чтобы скопировать эти файлы в "drop". Настройки, как показано ниже:
![введите описание изображения здесь]()
Теперь вы должны получить следующие вещи в папке с выпадающим списком:
Project.exe
SomeScripts
script.ps1
Ответ 3
"Сгладить папки" в разделе "Дополнительно" в разделе "Копировать файлы".
Если вы используете TFS Online (Visual Studio Online) и не нужно копировать структуру папок, используйте опцию "Сгладить папки" в разделе "Дополнительно" в разделе "Копировать файлы" в определении сборки
Ответ 4
Для тех, кто хотел бы иметь PowerShell script для использования на вашем сервере сборки, здесь работает (по крайней мере, на моем сервере сборки;)) sample:
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)
}
}
}
Здесь используется script, который используется на этапе сборки PowerShell:
![TFS 2015 Build - выход на шаг одиночной папки]()
Ответ 5
Сделайте артефакты каждого файла, который вы хотите скопировать. Затем создайте задачу "копировать файл" для каждого файла этих артефактов. Затем он не копирует структуру исходного дерева.
Ответ 6
С TFS2017update1 и выше, VSTS, вы можете просто проверить Сгладить папки в разделе "Дополнительно" в "Копировать файлы" , На данный момент это самое простое решение.
![введите описание изображения здесь]()
Это позволит сгладить структуру папок и скопировать все файлы в указанной целевой папке.
Ответ 7
Параметр flattenFolders также доступен в качестве параметра задачи YAML. В следующем фрагменте кода показана задача CopyFiles @2, которая копирует выходные данные сборки в $ (Build.ArtifactStagingDirectory). Когда я указываю параметр flattenFolders: true
структура вложенных папок bin\release\...\My.exe
сглаживается, это означает, что exe файлы копируются в корень $ (Build.ArtifactStagingDirectory).
- task: [email protected]
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.