Freigeben über


Buildreihenfolge für Ziele

Wenn die Eingabe für ein Ziel von der Ausgabe eines anderen Ziels abhängt, müssen die Ziele geordnet werden. Die Reihenfolge, in der die Ziele ausgeführt werden, kann auf unterschiedliche Weise angegeben werden.

  • Ursprüngliche Ziele

  • Standardziele

  • Erstes Ziel

  • Abhängigkeiten der Ziele

  • BeforeTargets und AfterTargets (MSBuild 4.0)

In keinem Fall wird ein Ziel während eines Builds zweimal ausgeführt, auch dann nicht, wenn ein nachfolgendes Ziel im Build von diesem abhängt. Sobald ein Ziel ausgeführt wurde, ist sein Beitrag zum Build abgeschlossen.

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

Ursprüngliche Ziele

Das Project-Element besitzt ein optionales InitialTargets-Attribut, als dessen Wert eine durch Semikolons getrennte sortierte Liste von Zielen verwendet werden kann. Beispiel:

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

gibt an, dass das Warm-Ziel und dann das Eject-Ziel ausgeführt wird.

Importierte Projekte können eigene InitialTargets-Attribute besitzen. Alle ursprünglichen Ziele werden zusammen aggregiert und in der festgelegten Reihenfolge ausgeführt. Die ursprünglichen Ziele werden in der Regel zur Fehlerprüfung verwendet.

Die ursprünglichen Ziele können in der Befehlszeile überschrieben werden. Beispiel:

msbuild /target:Build;Report

gibt an, dass das Build-Ziel und dann das Report-Ziel ausgeführt wird. Wenn Ziele auf diese Weise angegeben wurden, werden alle ursprünglichen Ziele ignoriert.

Weitere Informationen finden Sie unter Gewusst wie: Angeben des zuerst zu erstellenden Ziels.

Standardziele

Das Project-Element besitzt ebenfalls ein optionales DefaultTargets-Attribut, als dessen Wert eine durch Semikolons getrennte sortierte Liste von Standardzielen verwendet werden kann. Beispiel:

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

gibt an, dass das Clean-Ziel und dann das Build-Ziel ausgeführt wird.

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

Die Standardziele können in der Befehlszeile überschrieben werden. Beispiel:

msbuild /target:Build;Report

gibt an, dass das Build-Ziel und dann das Report-Ziel ausgeführt wird. Wenn Ziele auf diese Weise angegeben wurden, werden alle Standardziele ignoriert.

Wenn ursprüngliche Ziele und Standardziele angegeben werden, aber keine Befehlszeilenziele, werden von MSBuild zuerst die ursprünglichen Ziele und dann die Standardziele ausgeführt.

Erstes Ziel

Wenn keine ursprünglichen Ziele, Standardziele oder Befehlszeilenziele angegeben wurden, wird von MSBuild das erste in der Projektdatei oder einer beliebigen importierten Projektdatei gefundene Ziel ausgeführt.

Abhängigkeiten der Ziele

Ziele können untereinander Abhängigkeitsbeziehungen besitzen. Das DependsOnTargets-Attribut gibt an, dass ein Ziel von anderen Zielen abhängig ist. Beispiel:

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

informiert MSBuild darüber, dass das Serve-Ziel vom Chop-Ziel und dem Cook-Ziel abhängt. MSBuild führt das Chop-Ziel aus, dann das Cook-Ziel und letztlich das Serve-Ziel.

BeforeTargets und AfterTargets

In MSBuild 4.0 können Sie Reihenfolge der Ziele mit dem BeforeTargets-Attribut und dem AfterTargets-Attribut angeben.

Betrachten Sie das folgende Skript:

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

Wenn Sie das Optimize-Zwischenziel erstellen möchten und dieses nach dem Compile-Ziel, aber vor dem Link-Ziel ausgeführt werden soll, fügen Sie das folgende Ziel an einer beliebigen Stelle des Project-Elements hinzu.

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

Bestimmen der Buildreihenfolge für Ziele

MSBuild bestimmt die Buildreihenfolge der Ziele wie folgt:

  1. Ziele, die in der Befehlszeile durch den /target-Schalter angegeben wurden, werden ausgeführt. Wenn keine Ziele angegeben wurden, werden InitialTargets-Ziele ausgeführt, gefolgt von DefaultTargets-Zielen. Wenn keines von diesen vorhanden ist, wird das erste gefundene Ziel ausgeführt.

  2. Das Condition-Attribut des Ziels wird ausgewertet. Wenn das Condition-Attribut vorhanden ist und false ergibt, wird das Ziel nicht ausgeführt und besitzt keinen weiteren Auswirkungen auf den Build.

  3. Vor dem Ausführen eines Ziels werden dessen DependsOnTargets-Ziele ausgeführt.

  4. Vor dem Ausführen eines Ziels wird jedes Ziel ausgeführt, das dieses in einem BeforeTargets-Attribut aufführt.

  5. Vor dem Ausführen eines Ziels werden dessen Inputs-Attribut und Outputs-Attribut verglichen. Wenn MSBuild ermittelt, dass alle Ausgabedateien hinsichtlich der zugehörigen Eingabedatei oder -dateien veraltet sind, wird das Ziel von MSBuild ausgeführt. Andernfalls überspringt MSBuild das Ziel.

  6. Nachdem ein Ziel ausgeführt oder übersprungen wurde, wird jedes Ziel ausgeführt, das dieses in einem AfterTargets-Attribut aufführt.

Siehe auch

Konzepte

MSBuild-Ziele