Condividi tramite


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 attributo Project specifica le destinazioni che verranno eseguite per prime, anche se vengono specificate destinazioni nella riga di comando o nell'attributo DefaultTargets.

  • DefaultTargets. Questo Project attributo specifica le destinazioni eseguite se una destinazione non è specificata in modo esplicito nella riga di comando.

  • DependsOnTargets. Questo attributo Target specifica le destinazioni che devono essere eseguite prima di poter eseguire questa destinazione.

  • BeforeTargets e AfterTargets. Questi Target 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:

  1. Vengono eseguite le destinazioni InitialTargets.

  2. 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.

  3. Viene valutato l'attributo Condition della destinazione. Se l'attributo Condition è presente e restituisce false, la destinazione non viene eseguita e non ha effetto sulla compilazione.

    Le altre destinazioni che elencano la destinazione condizionale in BeforeTargets o AfterTargets vengono ancora eseguite nell'ordine prescritto.

  4. Prima che la destinazione venga eseguita o ignorata, vengono eseguite le relative destinazioni DependsOnTargets, a meno che l'attributo Condition non sia applicato alla destinazione e restituisca false.

    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.

  5. Prima che la destinazione venga eseguita o ignorata, vengono eseguite le eventuali altre destinazioni che la elencano in un attributo BeforeTargets.

  6. Prima che la destinazione venga eseguita, ne vengono confrontati gli attributi Inputs e Outputs. 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.

  7. Dopo che la destinazione viene eseguita o ignorata, vengono eseguite le eventuali altre destinazioni che la elencano in un attributo AfterTargets.