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ń?
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.
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:
- Dodaj krok "Kopiuj pliki", aby skopiować " projekt.exe". Ustawienia takie jak następujące:
- Dodaj krok "Kopiuj pliki", aby skopiować folder "SomeScripts". Ustawienia takie jak następujące:
- Dodaj " Kopia I Publish Build artefacts " krok, aby skopiować te pliki do "drop". Ustawienia takie jak następujące:
Teraz powinieneś dostać takie rzeczy jak następujące w folderze drop:
Project.exe
SomeScripts
script.ps1
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
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:
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.
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.
Spowoduje to spłaszczenie struktury folderów i skopiowanie wszystkich plików do określony folder docelowy.
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