Skopiuj jeden plik w katalogu docelowym podczas wdrażania z usługi Visual studio team services

Używam VSTS jako serwera kompilacji i podczas budowania chcę skopiować zawartość folderu bin do katalogu głównego docelowego, a także pliki niestandardowe z innego folderu do tego celu. MSDN sugeruje użycie wzorca minimatch, ale kopiuje pliki o strukturze podkatalogu. Nie interesuje mnie odbudowa struktury.

Na przykład otrzymuję strukturę folderów:

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

Ale chcę otrzymać taką strukturę folderów:

Project.exe
SomeScripts
    script.ps1

Który minimatch wzór czy mogę użyć dla moich wymagań?

Author: Scott Koland, 2016-01-04

6 answers

Z nowym webowym systemem budowania możesz używać wielu szablonów w jednym kroku. Dlatego możesz zrobić coś takiego dla swojej sprawy:

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

Lub jeśli masz platformę build i konfigurację w zmiennej (np. BuildPlatform / BuildConfiguration) których również używasz w kroku budowania, możesz użyć ich we wzorze:

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

Jeśli chcesz, aby project.exe było w katalogu głównym zamiast struktury, musisz użyć Copy Task, aby najpierw ustawić pliki w żądanej strukturze. Możesz użyć $(Build.StagingDirectory) jako cel tego. Następnie użyj zadania Publish z $(Build.StagingDirectory) jako copy root i Opublikuj wszystko od tego roota do kropli.

 4
Author: Pascal Berger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 07:12:40

Musisz określić główny katalog kopiowania, jeśli chcesz kopiować pliki tylko bez struktury folderów. Od czasu projektu.exe znajduje się w innej ścieżce z plikiem script. ps1, musisz je skopiować w innym zadaniu kopiowania.

Wykonując poniższe kroki:

  1. Dodaj krok "Kopiuj pliki", aby skopiować " projekt.exe". Ustawienia takie jak następujące: Tutaj wpisz opis obrazka
  2. Dodaj krok "Kopiuj pliki", aby skopiować folder "SomeScripts". Ustawienia takie jak następujące: Tutaj wpisz opis obrazka
  3. Dodaj " Kopia I Publish Build artefacts " krok, aby skopiować te pliki do "drop". Ustawienia takie jak następujące: Tutaj wpisz opis obrazka

Teraz powinieneś dostać takie rzeczy jak następujące w folderze drop:

Project.exe
SomeScripts
    script.ps1
 24
Author: Eddie Chen - MSFT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 02:39:35

Opcja "Spłaszcz foldery" w sekcji "Zaawansowane" kroku "Kopiuj pliki".

Jeśli używasz TFS Online (Visual Studio Online) i nie musisz kopiować struktury folderów, użyj opcji "Spłaszcz foldery" w sekcji "Zaawansowane" kroku "Kopiuj pliki" w definicji budowania

 7
Author: igor_1024,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 15:22:38

Dla tych, którzy chcieliby mieć skrypt PowerShell do użycia w swoim build serverze, oto działający (przynajmniej na moim build server ;)) przykład:

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)
        }
    }
}

Oto skrypt używany w kroku budowania PowerShell:

TFS 2015 Build-wyjście do pojedynczego folderu krok

 2
Author: DotBert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 07:04:32

Twórz artefakty KAŻDEGO pliku, który chcesz skopiować. Następnie Utwórz zadanie "Kopiuj plik" KAŻDEGO pliku z tych artefaktów. Wtedy nie kopiuje struktury drzewa źródłowego.

 0
Author: backyard hack mechanic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 09:33:19

Z TFS2017update1 i wyżej, VSTS, możesz po prostu sprawdzić spłaszczenie folderów w opcji Zaawansowane w zadanie kopiowania plików. Na razie najprostsze rozwiązanie.

Tutaj wpisz opis obrazka

Spowoduje to spłaszczenie struktury folderów i skopiowanie wszystkich plików do określony folder docelowy.

 0
Author: PatrickLu-MSFT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 02:33:10