Freigeben über


Buildreihenfolge für Ziele

Ziele müssen sortiert werden, wenn die Eingabe für ein Ziel von der Ausgabe eines anderen Ziels abhängt. Mit diesen Attributen können Sie die Reihenfolge angeben, in der Ziele ausgeführt werden:

  • InitialTargets. Dieses Project Attribut gibt die Ziele an, die zuerst ausgeführt werden, auch wenn Ziele in der Befehlszeile oder im DefaultTargets Attribut angegeben sind.

  • DefaultTargets. Dieses Project Attribut gibt an, welche Ziele ausgeführt werden, wenn ein Ziel nicht explizit in der Befehlszeile angegeben wird.

  • DependsOnTargets. Dieses Target Attribut gibt Ziele an, die ausgeführt werden müssen, bevor dieses Ziel ausgeführt werden kann.

  • BeforeTargets und AfterTargets. Diese Target Attribute geben an, dass dieses Ziel vor oder nach den angegebenen Zielen ausgeführt werden soll.

Im Allgemeinen sollten Sie nicht von der Deklarationsreihenfolge abhängen, um anzugeben, welche Aufgaben vor anderen Aufgaben ausgeführt werden.

Ein Ziel wird während eines Builds nie zweimal ausgeführt, auch wenn ein nachfolgendes Ziel im Build davon abhängt. Sobald ein Ziel ausgeführt wurde, ist sein Beitrag zum Build abgeschlossen.

Ziele können über ein Condition Attribut verfügen. Wenn die angegebene Bedingung den Wert false hat, wird das Ziel nicht ausgeführt und hat keine Auswirkungen auf den Build. Weitere Informationen zu Bedingungen finden Sie unter Bedingungen.

Anfängliche Ziele

Das InitialTargets Attribut des Project-Elements gibt Ziele an, die zuerst ausgeführt werden, auch wenn Ziele in der Befehlszeile oder im DefaultTargets Attribut angegeben sind. Anfängliche Ziele werden in der Regel für die Fehlerüberprüfung verwendet.

Der Wert des InitialTargets Attributs kann eine durch Semikolons getrennte, sortierte Liste von Zielen sein. Im folgenden Beispiel wird angegeben, dass das Warm Ziel ausgeführt wird, und anschließend wird das Eject Ziel ausgeführt.

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Importierte Projekte können eigene InitialTargets Attribute aufweisen. Alle anfänglichen Ziele werden aggregiert und in der Reihenfolge ausgeführt.

Weitere Informationen finden Sie unter So geben Sie an, welches Ziel zuerst erstellt werden soll.

Standardziele

Das DefaultTargets Attribut des Project-Elements gibt an, welches Ziel oder welche Ziele erstellt werden, wenn ein Ziel nicht explizit in einer Befehlszeile angegeben wird.

Der Wert des DefaultTargets Attributs kann eine durch Semikolons getrennte, sortierte Liste der Standardziele sein. Im folgenden Beispiel wird angegeben, dass das Clean Ziel ausgeführt wird, und anschließend wird das Build Ziel ausgeführt.

<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Sie können die Standardziele überschreiben, indem Sie den Schalter "-target " in der Befehlszeile verwenden. Im folgenden Beispiel wird angegeben, dass das Build Ziel ausgeführt wird, und anschließend wird das Report Ziel ausgeführt. Wenn Sie Ziele auf diese Weise angeben, werden alle Standardziele ignoriert.

msbuild -target:Build;Report

Wenn sowohl anfängliche Ziele als auch Standardziele angegeben sind und keine Befehlszeilenziele angegeben werden, führt MSBuild zuerst die ursprünglichen Ziele aus und führt dann die Standardziele aus.

Importierte Projekte können eigene DefaultTargets Attribute aufweisen. Das erste DefaultTargets gefundene Attribut bestimmt, welche Standardziele ausgeführt werden.

Weitere Informationen finden Sie unter So geben Sie an, welches Ziel zuerst erstellt werden soll.

Erstes Ziel

Wenn keine anfänglichen Ziele, Standardziele oder Befehlszeilenziele vorhanden sind, führt MSBuild das erste Ziel aus, das in der Projektdatei oder in importierten Projektdateien auftritt.

Zielabhängigkeiten

Ziele können Abhängigkeitsbeziehungen miteinander beschreiben. Das DependsOnTargets Attribut gibt an, dass ein Ziel von anderen Zielen abhängt. Beispiel:

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

weist MSBuild an, dass das Serve Ziel vom Chop Ziel und dem Cook Ziel abhängt. MSBuild führt das Chop Ziel aus und führt dann das Cook Ziel aus, bevor es das Serve Ziel ausführt.

Hinweis

Die Standardziele im SDK definieren eine Reihe von Eigenschaften, die die Liste der DependsOn Ziele enthalten, welche Abhängigkeiten für dieses Ziel sind (z. B. $(BuildDependsOn), $(CleanDependsOn) usw.). Beispiel:

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">

Zum Anpassen eines Projekts können Sie die DependsOn Eigenschaften mit zusätzlichen benutzerdefinierten Zielen überschreiben, die den Buildprozess erweitern, wie im Erweitern des Visual Studio-Buildprozesses beschrieben.

BeforeTargets und AfterTargets

Sie können die Zielreihenfolge mithilfe der Attribute BeforeTargets und AfterTargets angeben.

Betrachten Sie das folgende Skript.

<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Um ein Zwischenziel Optimize zu erstellen, das nach dem Compile Ziel ausgeführt wird, aber vor dem Link Ziel, fügen Sie das folgende Ziel an einer beliebigen Stelle im Project Element hinzu.

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

Alternativ geben Sie die Reihenfolge an als

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

Es ist nicht sinnvoll, beideBeforeTargets und AfterTargets für dasselbe Ziel anzugeben. Wie im nächsten Abschnitt beschrieben, führt nur das erste gefundene Ziel dazu, dass das neue Ziel ausgeführt wird.

Bestimmen der Zielbauprozessreihenfolge

MSBuild bestimmt die Zielbuildreihenfolge wie folgt:

  1. InitialTargets Ziele werden ausgeführt.

  2. Ziele, die in der Befehlszeile durch die Option "-target " angegeben sind, werden ausgeführt. Wenn Sie keine Ziele in der Befehlszeile angeben, werden die DefaultTargets Ziele ausgeführt. Wenn keines vorhanden ist, wird das erste gefundene Ziel ausgeführt.

  3. Das Condition Attribut des Ziels wird ausgewertet. Wenn das Condition Attribut vorhanden ist und zu false ausgewertet wird, wird das Ziel nicht ausgeführt und hat keine weiteren Auswirkungen auf den Build.

    Andere Ziele, die das bedingte Ziel in BeforeTargets oder AfterTargets auflisten, werden dennoch in der vorgeschriebenen Reihenfolge ausgeführt, unabhängig vom Ergebnis der Bedingung.

  4. Bevor das Ziel ausgeführt oder übersprungen wird, werden seine DependsOnTargets Ziele ausgeführt, es sei denn, das Condition Attribut wird auf das Ziel angewendet und zu false ausgewertet.

    Hinweis

    Ein Ziel wird als übersprungen betrachtet, wenn es nicht ausgeführt wird, da die Ausgabeelemente up-to-datum sind (siehe inkrementelles Build). Diese Überprüfung erfolgt direkt vor dem Ausführen der Aufgaben innerhalb des Ziels und wirkt sich nicht auf die Reihenfolge der Ausführung von Zielen aus.

  5. Bevor das Ziel ausgeführt oder übersprungen wird, wird jedes andere Ziel, das das Ziel in einem BeforeTargets Attribut auflistet, ausgeführt.

  6. Bevor das Ziel ausgeführt wird, werden das Inputs-Attribut und das Outputs-Attribut verglichen. Wenn MSBuild feststellt, dass alle Ausgabedateien in Bezug auf die entsprechende Eingabedatei oder -dateien veraltet sind, führt MSBuild das Ziel aus. Andernfalls überspringt MSBuild das Ziel.

  7. Nachdem das Ziel ausgeführt oder übersprungen wurde, wird jedes andere Ziel, das es in einem AfterTargets Attribut auflistet, ausgeführt.