Blog

Imitieren Sie die Option Ausgabeort des XAML-Builds in Build 2015

Jesse Houwing

Aktualisiert Oktober 22, 2025
4 Minuten
Wenn Sie in der Vergangenheit XAML-Builds verwendet haben, ist Ihnen wahrscheinlich aufgefallen, dass standardmäßig alle Ausgaben aller Ihrer Projekte in einem Ordner namens Binaries-Ordner abgelegt werden. Wenn Sie nicht mit einem Post-Build-Skript etwas unternehmen, wird der Inhalt dieses Ordners wortwörtlich in den Ablageort kopiert.

In TFS 2012 wurde eine neue Option eingeführt, die Ihnen etwas mehr Kontrolle über den Speicherort der Ausgabe gibt; Sie haben 3 Optionen:
  1. Einzelner Ordner (wie es 2010 funktionierte)
  2. Pro Projekt (Erzeugt einen Ordner pro Lösung)
  3. Wie konfiguriert (leiten Sie die Ausgabe nicht um, so dass die Standardeinstellung die Binärdateien in Ihren Projektordnern ablegen würde, so wie es auf Ihrem lokalen Rechner standardmäßig der Fall wäre).
Wenn es eine Funktion von XAML-Builds gibt, die viele Leute völlig verwirrt, dann ist es die Output Redirection. Zuerst erwarten die Leute nicht, dass dies geschieht (sie erwarten, dass "Wie konfiguriert" die Standardeinstellung ist) und dann verwirrt die Benennung "Pro Projekt" die Leute noch mehr, da sich herausstellt, dass am Ende ein Unterordner für jede Projektmappe oder msbuild .proj-Datei erstellt wird (basierend auf dem Namen der Projektmappe).

Build 2015 beseitigt dieses Problem, indem As Configured zur Standardeinstellung wird und eine einfache Aufgabe Copy and Publish Artifacts anbietet, die die Projektausgabe sammelt und an den Staging-Speicherort kopiert. Einer der schönen Vorteile dieser Einrichtung ist, dass sie auch die Durchführung inkrementeller Builds erleichtert und Ihre CI-Builds beschleunigt.

Wenn Sie jedoch von einem XAML-Build kommen und bereits viele Post-Build-Schritte haben, bei denen davon ausgegangen wird, dass sich alle Dateien in einem bestimmten Ordner oder einer bestimmten Gruppe von Ordnern befinden, kann es einfacher sein, dieses Verhalten zu replizieren, als all diese Skripts neu zu schreiben.

Gehen wir die drei Optionen in XAML Build durch und sehen wir uns an, wie Sie diese in Build 2015 handhaben.

Wie konfiguriert

Dies ist das Standardverhalten in Build 2015. Es tut, was immer Ihre Projektdateien konfiguriert haben. Wenn Sie die Standard-Projektvorlagen von Visual Studio verwenden, bedeutet dies, dass die Dateien im Ordner "ProjectBinConfiguration" abgelegt werden.

Sie verwenden eine standardmäßige Visual Studio Build- oder MsBuild-Aufgabe, gefolgt von einer Aufgabe zum Kopieren und Veröffentlichen von Artefakten, um die Ausgabe rekursiv zu sammeln und sie an den Bereitstellungsort und von dort an den Ablageort zu kopieren.

Bild 1

Die Standardkonfiguration der Aufgaben Kopieren und Veröffentlichen von Build-Artefakten sieht vor, das $(Build.SourcesDirectory) rekursiv zu durchsuchen und den Inhalt jedes"bin"-Ordners zu erfassen.

Bild 2
Wenn Sie As Configured in XAML-Builds verwenden, wird nichts in Ihren Ablageordner kopiert, es sei denn, Sie tun dies tatsächlich. Die Aufgabe Artefakte kopieren und veröffentlichen übernimmt dies für Sie. Oder Sie können Ihr eigenes Powershell-, Batch- oder anderes Skript ausführen, um Ihre Dateien in das $(Build.ArtifactStagingDirectory) zu kopieren. Übergeben Sie den Zielspeicherort entweder über ein Argument oder holen Sie ihn sich aus Ihrem Powershell-Skript über die Umgebungsvariable $env:Build_ArtifactStagingDirectory:
Bild 3

Rufen Sie dann die Aufgabe Publish Build Artifacts auf, um sie zu veröffentlichen (beachten Sie, dass Sie hier nicht die Aufgabe Copy and Publish verwenden sollten, da Ihr Skript die Dateien bereits kopiert hat).

Bild 4

Einzelne Mappe

Wenn Sie in XAML-Builds einen einzelnen Ordner angeben, landen alle Binärdateien für alle Ihre Projekte im Stammverzeichnis des Ablageorts. Dies war die Standardeinstellung in Team Foundation Server 2010 und sorgte für viel Verwirrung, als die Leute damals anfingen, Team Build einzuführen.

Es gibt zwei Möglichkeiten, dieses Verhalten zu imitieren. Zum einen können Sie Ihre Lösung ohne zusätzliche Optionen erstellen und dann die Standardaufgabe Kopieren und Veröffentlichen verwenden. Ich gehe davon aus, dass Sie hier möglicherweise mehrere Konfigurationen erstellen:

Bild 4

Wenn Sie alle Ordner unter bin erfassen möchten, können Sie dies weiter vereinfachen: **bin.

Diese Lösung führt zum gleichen Ergebnis, kann aber dennoch Probleme mit Ihren aktuellen Skripten verursachen, die davon ausgehen, dass msbuild alle Ausgaben in einen einzigen Ordner umleitet. Es ist nicht schwer, eine Situation zu schaffen, die noch näher an der Funktionalität des alten XAML-Builds ist.

Als erstes müssen Sie die Aufgabe Visual Studio Build anweisen, die Build-Ausgabe in das $(Build.BinariesDirectory) umzuleiten.

Bild 5

Dann kopieren Sie einfach alles aus dem Verzeichnis $(Build.BinariesDirectory) in das Staging-Verzeichnis und veröffentlichen es:

veröffentlichen

Der Vorteil der Verwendung des Zwischenverzeichnisses für Binärdateien ist, dass Sie inkrementelle Builds durchführen können, wenn Sie direkt in das $(Build.ArtifactStagingDirectory) ablegen, wird die Ausgabe nach jedem Build weggeworfen, was die Build-Zeit verlängert, wenn Sie nicht Clean Repository und Clean Build verwenden.

Pro Projekt

Die dritte Option in der XAML-Erstellung ermöglicht es Ihnen, einen Unterordner für jede... und hier wird es verwirrend... Ausgewählte Lösung. Es heißt "Projekt", aber ich glaube, das stammt noch aus der Ära 2008, als Sie eine MsBuild Proj-Datei erstellten.  

Es gibt keine einfache Möglichkeit, dies in Build 2015 zu tun. Sie könnten Build Multiplexing verwenden oder mehrere Visual Studio Build-Aufgaben hinzufügen, gefolgt von mehreren Aufgaben zum Kopieren und Veröffentlichen von Build-Artefakten. Im Grunde genommen übernehmen Sie die Technik der SingleFolder-Option und fügen den Namen der Lösung hardcodiert in jeder Aufgabe oder über eine benutzerdefinierte Variable hinzu.

Verfasst von

Jesse Houwing

Jesse is a passionate trainer and coach, helping teams improve their productivity and quality all while trying to keep work fun. He is a Professional Scrum Trainer (PST) through Scrum.org, Microsoft Certified Trainer and GitHub Accredited Trainer. Jesse regularly blogs and you'll find him on StackOverflow, he has received the Microsoft Community Contributor Award three years in a row and has been awarded the Microsoft Most Valuable Professional award since 2015. He loves espresso and dark chocolate, travels a lot and takes photos everywhere he goes.

Contact

Let’s discuss how we can support your journey.