Ordine di compilazione delle destinazioni
Le destinazioni devono venire ordinate se l'input per una destinazione dipende dall'output di un'altra destinazione. È possibile usare questi attributi per specificare l'ordine in cui vengono eseguite le destinazioni:
InitialTargets
. Questo attributoProject
specifica le destinazioni che verranno eseguite per prime, anche se vengono specificate destinazioni nella riga di comando o nell'attributoDefaultTargets
.DefaultTargets
. QuestoProject
attributo specifica le destinazioni eseguite se una destinazione non è specificata in modo esplicito nella riga di comando.DependsOnTargets
. Questo attributoTarget
specifica le destinazioni che devono essere eseguite prima di poter eseguire questa destinazione.BeforeTargets
eAfterTargets
. QuestiTarget
attributi specificano che questa destinazione deve essere eseguita prima o dopo le destinazioni specificate.
In generale, non è consigliabile dipendere dall'ordine di dichiarazione per specificare le attività eseguite prima di altre attività.
Una destinazione non viene mai eseguita due volte durante una compilazione, anche se ne dipende una destinazione successiva nella compilazione. Dopo che una destinazione è stata eseguita, il contributo alla compilazione è completo.
Le destinazioni possono avere un Condition
attributo . Se la condizione specificata restituisce false
, la destinazione non viene eseguita e non ha effetto sulla compilazione. Per altre informazioni sulle condizioni, vedere Condizioni.
Destinazioni iniziali
L'attributo InitialTargets
dell'elemento Project specifica le destinazioni che verranno eseguite per prime, anche se vengono specificate destinazioni nella riga di comando o nell'attributo DefaultTargets
. Le destinazioni iniziali vengono in genere usate per il controllo degli errori.
Il valore dell'attributo InitialTargets
può essere un elenco ordinato di destinazioni delimitate da punto e virgola. L'esempio seguente specifica che viene eseguita la destinazione Warm
e quindi la destinazione Eject
.
<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
I progetti importati possono avere attributi propri InitialTargets
. Tutte le destinazioni iniziali vengono aggregate ed eseguite nell'ordine specificato.
Per altre informazioni, vedere Procedura: Specificare quale destinazione compilare per prima.
Destinazioni predefinite
L'attributo DefaultTargets
dell'elemento Project specifica la destinazione o le destinazioni che vengono compilate se non viene specificata una destinazione in modo esplicito in una riga di comando.
Il valore dell'attributo DefaultTargets
può essere un elenco ordinato di destinazioni predefinite delimitate da punto e virgola. L'esempio seguente specifica che viene eseguita la destinazione Clean
e quindi la destinazione Build
.
<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
È possibile eseguire l'override delle destinazioni predefinite usando l'opzione -target nella riga di comando. L'esempio seguente specifica che viene eseguita la destinazione Build
e quindi la destinazione Report
. Quando si specificano le destinazioni in questo modo, le destinazioni predefinite vengono ignorate.
msbuild -target:Build;Report
Se sia le destinazioni iniziali che quelle predefinite vengono specificate e se non viene specificata alcuna destinazione della riga di comando, MSBuild esegue prima le destinazioni iniziali e quindi le destinazioni predefinite.
I progetti importati possono avere attributi propri DefaultTargets
. Il primo attributo DefaultTargets
rilevato determina le destinazioni predefinite che verranno eseguite.
Per altre informazioni, vedere Procedura: Specificare quale destinazione compilare per prima.
Prima destinazione
Se non sono presenti destinazioni iniziali, destinazioni predefinite o destinazioni della riga di comando, MSBuild esegue la prima destinazione rilevata nel file di progetto o nei file di progetto importati.
Dipendenze tra destinazioni
Le destinazioni possono descrivere relazioni di dipendenza reciproche. L'attributo DependsOnTargets
indica che una destinazione dipende da altre destinazioni. ad esempio:
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
Il codice precedente indica a MSBuild che la destinazione Serve
dipende dalla destinazione Chop
e dalla destinazione Cook
. MSBuild esegue la destinazione Chop
e quindi esegue la destinazione Cook
prima di eseguire la destinazione Serve
.
Nota
Le destinazioni standard nell'SDK definiscono una serie di DependsOn
proprietà che contengono l'elenco di destinazioni che sono dipendenze per tale destinazione (ad esempio, $(BuildDependsOn)
, $(CleanDependsOn)
e così via). ad esempio:
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
Per personalizzare un progetto, è possibile eseguire l'override delle DependsOn
proprietà con destinazioni personalizzate aggiuntive che estendono il processo di compilazione, come descritto in Estendere il processo di compilazione di Visual Studio.
BeforeTargets e AfterTargets
È possibile specificare l'ordine di destinazione usando gli BeforeTargets
attributi e AfterTargets
.
Considerare lo script seguente.
<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>
Per creare una destinazione Optimize
intermedia da eseguire dopo la destinazione Compile
, ma prima della destinazione Link
, aggiungere la destinazione seguente nell'elemento Project
.
<Target Name="Optimize" AfterTargets="Compile">
<Message Text="Optimizing" />
</Target>
In alternativa, specificare l'ordine come
<Target Name="Optimize" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
Non è utile specificare sia che BeforeTargets
AfterTargets
nella stessa destinazione. Come descritto nella sezione successiva, solo la prima destinazione rilevata causerà l'esecuzione della nuova destinazione.
Determinare l'ordine di compilazione delle destinazioni
MSBuild determina l'ordine di compilazione delle destinazioni, come segue:
Vengono eseguite le destinazioni
InitialTargets
.Vengono eseguite le destinazioni specificate nella riga di comando dall'opzione -target. Se non si specifica alcuna destinazione nella riga di comando, vengono eseguite le destinazioni
DefaultTargets
. Se nessuna delle due destinazioni è presente, viene eseguita la prima destinazione rilevata.Viene valutato l'attributo
Condition
della destinazione. Se l'attributoCondition
è presente e restituiscefalse
, la destinazione non viene eseguita e non ha effetto sulla compilazione.Le altre destinazioni che elencano la destinazione condizionale in
BeforeTargets
oAfterTargets
vengono ancora eseguite nell'ordine prescritto.Prima che la destinazione venga eseguita o ignorata, vengono eseguite le relative destinazioni
DependsOnTargets
, a meno che l'attributoCondition
non sia applicato alla destinazione e restituiscafalse
.Nota
Una destinazione viene considerata ignorata se non viene eseguita perché gli elementi di output sono aggiornati (vedere Compilazione incrementale). Questo controllo viene eseguito subito prima di eseguire le attività all'interno della destinazione e non influisce sull'ordine di esecuzione delle destinazioni.
Prima che la destinazione venga eseguita o ignorata, vengono eseguite le eventuali altre destinazioni che la elencano in un attributo
BeforeTargets
.Prima che la destinazione venga eseguita, ne vengono confrontati gli attributi
Inputs
eOutputs
. Se MSBuild determina che sono presenti file di output scaduti rispetto al file o ai file di input corrispondenti, MSBuild esegue la destinazione. In caso contrario, MSBuild ignora la destinazione.Dopo che la destinazione viene eseguita o ignorata, vengono eseguite le eventuali altre destinazioni che la elencano in un attributo
AfterTargets
.