Buildreihenfolge für Ziele
Ziele müssen geordnet werden, wenn die Eingabe für ein Ziel von der Ausgabe eines anderen Ziels abhängt. Sie können diese Attribute verwenden, um die Reihenfolge anzugeben, in der Ziele ausgeführt werden:
InitialTargets
. DasProject
-Attribut gibt die Ziele an, die zuerst ausgeführt werden, auch wenn Ziele in der Befehlszeile oder imDefaultTargets
-Attribut angegeben sind.DefaultTargets
. DasProject
-Attribut gibt an, welche Ziele ausgeführt werden, wenn ein Ziel nicht explizit in der Befehlszeile angegeben wird.DependsOnTargets
. DasTarget
-Attribut gibt Ziele an, die ausgeführt werden müssen, bevor das Ziel ausgeführt werden kann.BeforeTargets
undAfterTargets
. DieseTarget
-Attribute geben an, dass das Ziel vor oder nach den angegebenen Zielen ausgeführt werden soll.
Im Allgemeinen sollten Sie sich nicht auf die Reihenfolge der Deklarationen verlassen, um festzulegen, welche Aufgaben zuerst ausgeführt werden.
Ein Ziel wird während eines Builds nie zweimal ausgeführt, auch 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 über ein Condition
-Attribut verfügen. Wenn die angegebene Bedingung false
ergibt, wird das Ziel nicht ausgeführt und hat keine Auswirkung auf den Build. Weitere Informationen zu Bedingungen finden Sie unter Bedingungen.
Ursprüngliche Ziele
Das InitialTargets
-Attribut des Projekt-Elements gibt Ziele an, die zuerst ausgeführt werden, auch wenn Ziele in der Befehlszeile oder im DefaultTargets
-Attribut angegeben sind. Ursprüngliche Ziele werden in der Regel für die Überprüfung von Fehlern verwendet.
Der Wert des InitialTargets
-Attribut kann eine durch Semikolons getrennte, geordnete Liste von Zielen sein. Das folgende Beispiel gibt an, dass das Warm
-Ziel ausgeführt wird und dann das Eject
-Ziel ausgeführt wird.
<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Importierte Projekte können ihre eigenen InitialTargets
-Attribute haben. Alle ursprünglichen Ziele werden zusammen aggregiert und gemäß Reihenfolge ausgeführt.
Weitere Informationen finden Sie unter Vorgehensweise: Angeben des zuerst zu erstellenden Ziels.
Standardziele
Das DefaultTargets
-Attribut des Projekt-Elements gibt das Ziel bzw. die Ziele an, die erstellt werden, wenn ein Ziel nicht explizit in einer Befehlszeile angegeben wird.
Der Wert des DefaultTargets
-Attributs kann eine durch Semikolons getrennte, geordnete Liste von Standardzielen sein. Das folgende Beispiel gibt an, dass das Clean
-Ziel ausgeführt wird und dann das Build
-Ziel ausgeführt wird.
<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. Das folgende Beispiel gibt an, dass das Build
-Ziel ausgeführt wird und dann das Report
-Ziel ausgeführt wird. Wenn Sie Ziele auf diese Weise angeben, werden alle Standardziele ignoriert.
msbuild -target:Build;Report
Wenn ursprüngliche Ziele und Standardziele angegeben werden und keine Befehlszeilenziele angegeben sind, führt MSBuild zuerst die ursprünglichen Ziele und dann die Standardziele aus.
Importierte Projekte können ihre eigenen DefaultTargets
-Attribute haben. Die erste DefaultTargets
-Attribut bestimmt, welche Standardziele ausgeführt werden.
Weitere Informationen finden Sie unter Vorgehensweise: Angeben des zuerst zu erstellenden Ziels.
Erstes Ziel
Wenn keine ursprünglichen Ziele, Standardziele oder Befehlszeilenziele vorhanden sind, führt MSBuild das erste Ziel aus, das in der Projektdatei oder einer beliebigen importierten Projektdatei angetroffen wird.
Zielabhängigkeiten
Ziele können Abhängigkeitsbeziehungen unter Zielen beschreiben. Die DependsOnTargets
-Attribut gibt an, dass ein Ziel von anderen Zielen abhängig ist. Beispiel:
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
informiert MSBuild, dass das Serve
-Ziel vom Chop
-Ziel und dem Cook
-Ziel abhängig ist. MSBuild führt das Chop
-Ziel und dann das Cook
-Ziel aus, bevor das Serve
-Ziel ausgeführt wird.
Hinweis
Die Standardziele im SDK definieren eine Reihe von DependsOn
-Eigenschaften, die die Liste der Ziele enthalten, die Abhängigkeiten von diesem Ziel darstellen (z. B. $(BuildDependsOn)
und $(CleanDependsOn)
). Beispiel:
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
Um ein Projekt anzupassen, können Sie die DependsOn
-Eigenschaften mit zusätzlichen benutzerdefinierten Zielen überschreiben, die den Build-Prozess erweitern, wie unter Erweitern des Visual Studio-Build-Prozesses beschrieben.
Vorher-Ziele und Nachher-Ziele
Sie können die Reihenfolge der Ziele mithilfe der BeforeTargets
- und AfterTargets
-Attribute angeben.
Betrachten Sie folgendes 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>
Zum Erstellen eines Zwischenziels Optimize
, das nach dem Compile
-Ziel, aber vor der Link
-Ziel ausgeführt wird, fügen Sie das folgende Ziel an einer beliebigen Stelle im Project
-Element hinzu.
<Target Name="Optimize" AfterTargets="Compile">
<Message Text="Optimizing" />
</Target>
Geben Sie alternativ die Reihenfolge an als
<Target Name="Optimize" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
Es ist nicht nützlich, sowohl BeforeTargets
als auch AfterTargets
für dasselbe Ziel anzugeben. Wie im nächsten Abschnitt beschrieben, führt nur das erste aufgetretene Ziel dazu, dass das neue Ziel ausgeführt wird.
Bestimmen der Buildreihenfolge für Ziele
MSBuild bestimmt die Buildreihenfolge für Ziele wie folgt:
InitialTargets
-Ziele werden ausgeführt.Auf der Befehlszeile mit dem Schalter -target angegebene Ziele werden ausgeführt. Wenn Sie keine Ziele in der Befehlszeile angeben, werden die
DefaultTargets
-Ziele ausgeführt. Wenn keine Ziele vorhanden sind, wird das erste gefundene Ziel ausgeführt.Das
Condition
-Attribut des Ziels wird ausgewertet. Wenn dasCondition
-Attribut vorhanden ist undfalse
ergibt, wird das Ziel nicht ausgeführt und hat keine weitere Auswirkung auf den Build.Andere Ziele, die das bedingte Ziel in
BeforeTargets
oderAfterTargets
auflisten, werden dennoch in der vorgeschriebenen Reihenfolge ausgeführt.Bevor das Ziel ausgeführt oder übersprungen wird, werden seine
DependsOnTargets
-Ziele ausgeführt, es sei denn, dasCondition
-Attribut wird auf das Ziel angewendet und zufalse
ausgewertet.Hinweis
Ein Ziel wird als übersprungen angesehen, wenn es nicht ausgeführt wird, weil seine Ausgabeelemente aktuell sind (siehe inkrementeller Build). Diese Überprüfung erfolgt unmittelbar vor dem Ausführen der Aufgaben im Ziel und wirkt sich nicht auf die Ausführungsreihenfolge der Ziele aus.
Bevor das Ziel ausgeführt oder übersprungen wird, wird jedes andere Ziel ausgeführt, das es in einem
BeforeTargets
-Attribut auflistet.Bevor das Ziel ausgeführt wird, werden sein
Inputs
-Attribut undOutputs
-Attribut verglichen. Wenn MSBuild feststellt, dass alle Ausgabedateien in Bezug auf die entsprechende(n) Eingabedatei(en) veraltet sind, wird das Ziel von MSBuild ausgeführt. Andernfalls überspringt MSBuild das Ziel.Nachdem das Ziel ausgeführt oder übersprungen wurde, wird jedes andere Ziel ausgeführt, das es in einem
AfterTargets
-Attribut auflistet.