it-swarm.com.ru

Скопируйте один файл в целевой каталог при развертывании из сервисов команды Visual Studio

Я использую VSTS в качестве сервера сборки, и во время сборки я хочу скопировать содержимое папки bin в корень цели, а также пользовательские файлы из другой папки в эту цель. MSDN предлагает использовать шаблон minimatch, но он копирует файлы со структурой подкаталогов. Я не заинтересован в восстановлении структуры.

Например, я получаю эту структуру папок:

Project
    MyProjectFiles
    bin
        x86 (it's build configuration)
            Project.exe
    Other project files
    Project.sln
SomeScrips
    script1.ps1

Но я хочу получить эту структуру папок:

Project.exe
SomeScripts
    script.ps1

Какой шаблон мини-матча я могу использовать для своих требований? 

15
Georgy Grigoryev

С новой веб-системой сборки вы можете использовать несколько шаблонов за один шаг. Поэтому вы можете сделать что-то подобное для вашего случая:

Project\bin\x86\Release\project.exe
SomeScripts\**\*

Или, если у вас есть платформа сборки и конфигурация в переменной (например, BuildPlatform/BuildConfiguration), которую вы также используете на этапе сборки, вы можете использовать их в шаблоне:

Project\bin\$(BuildPlatform)\$(BuildConfiguration)\project.exe
SomeScripts\**\*

Если вы хотите, чтобы project.exe находился в корне, а не в структуре, вам нужно использовать Copy Task, чтобы сначала разместить файлы в нужной структуре. Вы можете использовать $(Build.StagingDirectory) в качестве цели для этого. Затем используйте задачу «Опубликовать» с $(Build.StagingDirectory) в качестве копии корневого каталога и опубликуйте все, начиная с этого корневого каталога, и заканчивая его удалением.

4
Pascal Berger

Вам нужно указать корневой каталог, если вы хотите копировать файлы только без структуры папок. Поскольку файл project.exe находится по другому пути с файлом script.ps1, их необходимо скопировать в другой задаче копирования. 

Следуя инструкциям ниже:

  1. Добавьте шаг «Копировать файлы», чтобы скопировать «project.exe». Настройки, такие как:  enter image description here
  2. Добавьте шаг «Копировать файлы», чтобы скопировать папку «SomeScripts». Настройки, такие как:  enter image description here
  3. Добавьте шаг «Копировать и опубликовать артефакты сборки», чтобы скопировать эти файлы в «перетаскивание». Настройки, такие как:  enter image description here

Теперь вы должны получить следующие вещи в папке drop:

Project.exe
SomeScripts
    script.ps1
24
Eddie Chen - MSFT

Параметр «Сгладить папки» в разделе «Дополнительно» шага «Копирование файлов».

Если вы используете TFS Online (Visual Studio Online) и вам не нужно копировать структуру папок, используйте параметр «Свести папки» в разделе «Дополнительно» шага «Копирование файлов» в определении сборки.

7
igor_1024

Для тех, кто хотел бы использовать скрипт 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:

 TFS 2015 Build - Output to single folder step

2
DotBert

Параметр 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

1
thomasgalliker

С TFS2017update1 и выше, VSTS, вы можете просто проверить Свести папки в разделе «Дополнительно» в Задача копирования файлов . Самое простое решение на данный момент.

 enter image description here

Это сгладит структуру папок и скопирует все файлы в указанная целевая папка.

0
PatrickLu-MSFT

Сделайте артефакты для каждого файла, который вы хотите скопировать. Затем создайте задачу «копировать файл» для каждого файла этих артефактов. Тогда это не копирует структуру дерева источника.

0
backyard hack mechanic