Freigeben über


MSBuild-Ziele

Aktualisiert: November 2007

Ziele dienen dazu, Aufgaben in einer bestimmten Reihenfolge zu gruppieren und Abschnitte des Buildprozesses über die Befehlszeile aufzurufen. Sie werden oft in logischen Abschnitten gruppiert, um die Erweiterung von Projektdateien zu ermöglichen und die Lesbarkeit zu verbessern. Zur Vorbereitung des Builds kann ein Ziel beispielsweise alle Dateien im Ausgabeverzeichnis löschen, während ein anderes Ziel die Eingaben für das Projekt kompiliert und sie im leeren Verzeichnis ablegt.

Deklarieren von Zielen in der Projektdatei

Ziele werden in der Projektdatei mit dem Target-Element deklariert. Durch den folgenden XML-Code wird beispielsweise ein Ziel mit dem Namen Compile erstellt, durch das anschießend die Csc-Aufgabe mit der Compile-Elementauflistung aufgerufen wird.

<Target Name="Compile>
    <Csc Sources="@(Compile)" />
</Target>

Ziele können zudem das Condition-Attribut verwenden. Wenn die angegebene Bedingung zu False ausgewertet wird, wird das Ziel nicht ausgeführt. Gleichzeitig werden im Modul MSBuild die im DependsOnTargets-Attribut festgelegten Ziele nicht ausgeführt. Weitere Informationen zu Bedingungen finden Sie unter MSBuild-Bedingungen.

Abhängigkeitsanalyse

In fortgeschritteneren Szenarien können Ziele die zwischen verschiedenen Zielen bestehenden Beziehungen beschreiben und Abhängigkeitsanalysen durchführen. Wenn das jeweilige Ziel aktuell ist, können ganze Bereiche des Buildvorgangs übersprungen werden. Sie können die Ziele, die vor einem bestimmten Ziel ausgeführt werden müssen, mit dem DependsOnTargets-Attribut deklarieren. Bei der Ausführung eines Ziels werden im Modul MSBuild automatisch alle in diesem Attribut aufgeführten Ziele zuerst ausgeführt. Weitere Informationen finden Sie unter Gewusst wie: Inkrementelles Erstellen.

Hinweis:

Ein Ziel wird während eines einzelnen Builds niemals zweimal ausgeführt. Nach der Ausführung wird die Funktion des Ziels als beendet angesehen. Das Ziel wird nicht erneut ausgeführt, auch wenn ein nachfolgendes Ziel im Build von ihm abhängt.

Optimale Vorgehensweisen

Wenn die Projektdatei auf diese Weise untergliedert wird, können Abschnitte der Datei geändert werden, ohne dass andere davon beeinflusst werden. Eine Möglichkeit, ein Projekt mit Ressourcen zu erstellen, besteht beispielsweise darin, die GenerateResource-Aufgabe und die Csc-Aufgabe im selben Ziel abzulegen:

<Target Name="Build">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Bei dieser Vorgehensweise wird das Projekt zwar normal erstellt, das Ziel ist jedoch sperrig und unflexibel. Wenn Sie später weitere Aufgaben hinzufügen möchten, die zwischen GenerateResource und Csc ausgeführt werden, würde die Lesbarkeit der Projektdatei leiden, wenn alle Aufgaben in einem Ziel enthalten sind. Das Schreiben derart großer Ziele mit einer so großen Anzahl von Aufgaben macht es außerdem schwierig, zuverlässige inkrementelle Builds auszuführen, in denen nur diejenigen Ziele neu erstellt werden, die noch nicht erstellt wurden oder veraltet sind. Durch große Ziele wird außerdem verhindert, dass Ziele zur Erledigung spezifischer Aufgaben ausgeführt werden. Im vorangehenden Beispiel gibt es keine Möglichkeit, Ressourcen ohne Kompilierung zu generieren.

Eine bessere Möglichkeit zum Schreiben von Projektdateien besteht darin, mehrere Ziele zu verwenden und Abhängigkeiten zwischen den Zielen explizit auszudrücken. Bei dieser Vorgehensweise können beliebige Ziele in jedem Buildvorgang auch separat ausgeführt werden, und anstatt lange Aufgabenlisten in einem Ziel abzuarbeiten, kann auch eine kleinere Anzahl von Aufgaben ausgeführt werden. In diesem Beispiel befindet sich jede Aufgabe in einem separaten Ziel, und durch das DependsOnTargets-Attribut wird festgelegt, dass das Resources-Ziel vor dem Build-Ziel ausgeführt werden muss.

<Target Name="Resources">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
</Target>

<Target Name="Build" DependsOnTargets="Resources">
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Siehe auch

Aufgaben

Gewusst wie: Angeben des zuerst zu erstellenden Ziels

Gewusst wie: Verwenden eines Ziels in mehreren Projektdateien

Konzepte

Übersicht über MSBuild

Weitere Ressourcen

MSBuild-Grundlagen