Wer schon einmal in seinem Build verschiedene Dateien kopieren und als Artifakte ablegen wollte, der kommt an den Tasks Copy Files und Publish Build Artifacts nicht vorbei. Wer beide Tasks kombinieren möchte kann Copy and Publish Build Artifacts verwenden.
Sofern jemand seine Dateien nicht kopieren möchte, um diese vor dem Publish noch anzupassen, lassen sich beide ähnlich anwenden. Es kann ein Quellverzeichnis ausgewählt und mehrere Dateien über ein Minimatch-Pattern selektiert werden. Anschließend lässt sich ein Artifaktname und der Artifakttyp angeben. Doch wo genau unterscheiden sich diese nun?
Auf die Lösung kommt man, wenn man versucht Dateien zu exkludieren. Bei einem Minimatch-Pattern (siehe minimatch) kann über ein führendes Anführungszeichen eine Anweisung negiert werden. Dadurch lassen sich z.B. mit !**\node_modules\**
sämtliche npm-Pakete aus den Artifakten exkludieren. Versucht man dies jedoch mit dem Copy and Publish Build Artifacts Task, so wird der Ordner nicht exkludiert, sondern trotzdem mitkopiert. Wie kann das sein?
Die Lösung findet sich im Source Code der Build Tasks wieder. Hier zeigt sich, das Copy and Publish Build Artifacts nicht auf die bereits bestehenden Tasks Copy Files und Publish Build Artifacts verweist, sondern eine eigene Implementierung besitzt. Anbei ist der Unterschied zwischen Copy and Publish Build Artifacts und Copy Files beim Matchen der Dateien dargestellt:
Unterschied: Copy and Publish Build Artifacts und Copy Files
Wer auf Zeile 101-104 in Copy Files schaut, sieht, dass hier die Negierung von Patterns berücksichtigt wurde, bei Copy and Publish Build Artifacts jedoch nicht. Auf der MSDN-Seite der Copy and Publish Build Artifacts Task wurde dazu folgender Beitrag veröffentlicht:
MSDN FAQ zu Copy and Publish Build Artifacts
Interessanterweise gibt es nicht nur unterschiedliche Implementierung in den Microsoft Tasks, sondern auch unterschiedliche Suchmuster für Dateien. Z.B. bei den Visual Studio Test Tasks kann bei der Test Assembly ebenfalls ein Suchmuster eingeben werden . Hier sieht ein exkludieren von Test Assemblies wie folgt aus: **\*Test*.dll;-:**\obj\**
Die Zeichenkombination -:
exkludiert alle Dateien, die dem nachfolgenden Suchmuster entsprechen. Hierbei handelt es sich nicht um ein Minimatch-Pattern. Das zeigt sich auch, wenn man die Implementierung der Task betrachtet (siehe unten). Für diese wird die PowerShell Funktion Find-Files verwendet, welche ein eigenes Pattern besitzt. Wenn man sich die JavaScript-Implementierung der Task anschaut, so ist dieses Extra-Pattern auch dort implementiert.
Implementierung der Visual Studio Test Tasks
Als Fazit ziehen wir somit: Man kann sich nie sicher sein, dass zusammengeführte Tasks auf vorherige Implementierungen verweisen oder gleich implementiert wurden. Dies lässt sich u.a. beim Exkludieren von Dateien oder auch bei Suchmustern beobachten. Hier hilft notfalls nur ein Blick in die Sourcen der Tasks. Unser Tipp: Wer diese nicht vom TFS bekommt, kann für die Microsoft Tasks auch auf GitHub schauen.
Guter Hinweis, dass die Implementierungen von CopyAndPublishBuildArtifacts nicht auf die Implementierung der Einzel-Tasks (CopyFiles, PublishBuildArtifacts) zurückgreift. Als Konsequenz werden wir die Einzel-Tasks einsetzen, um Probleme mit Minimatch-Patterns zu vermeiden.
Noch ein Hinweis:
Das Exkludieren von Dateien im VS Test Task erreicht man per -: (statt ;-:). Das Semikolon ist lediglich dazu da, um mehrere Include- und Exclude-Patterns von einander zu trennen.
Quelle: https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/VsTest/README.md
Hallo Herr Eue,
danke für den Hinweis, ich habe es im Beitrag angepasst.