Condividi tramite


Ordine di compilazione delle destinazioni

Se l'input di una destinazione dipende dall'output di un'altra destinazione, le destinazioni devono essere ordinate. Esistono diversi modi per specificare l'ordine di esecuzione delle destinazioni.

  • Destinazioni iniziali

  • Destinazioni predefinite

  • Prima destinazione

  • Dipendenze fra destinazioni

  • BeforeTargets e AfterTargets (MSBuild 4.0)

Una destinazione non viene mai eseguita due volte durante una compilazione, anche se una destinazione successiva nella build dipende da essa. Quando una destinazione viene eseguita, il contributo di quest'ultima alla build è completo.

Le destinazioni possono presentare un attributo Condition. Se la condizione specificata risulta essere false, la destinazione non viene eseguita e non influisce sulla build. Per ulteriori informazioni sulle condizioni, vedere Condizioni di MSBuild.

Destinazioni iniziali

L'elemento Project presenta un attributo InitialTargets facoltativo il cui valore può essere un elenco ordinato di destinazioni delimitato da punti e virgola. Ad esempio,

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

specifica che viene eseguita prima la destinazione Warm e quindi la destinazione Eject.

I progetti importati possono presentare attributi InitialTargets propri. Tutte le destinazioni iniziali vengono aggregate insieme e vengono eseguite in ordine. In genere le destinazioni iniziali vengono utilizzate per il controllo degli errori.

È possibile eseguire l'override delle destinazioni iniziali tramite la riga di comando. Ad esempio,

msbuild /target:Build;Report

specifica che viene eseguita prima la destinazione Build e quindi la destinazione Report. Quando le destinazioni vengono specificate in questo modo, tutte le destinazioni iniziali vengono ignorate.

Per ulteriori informazioni, vedere Procedura: specificare quale destinazione compilare per prima.

Destinazioni predefinite

L'elemento Project presenta anche un attributo DefaultTargets facoltativo il cui valore può essere un elenco ordinato di destinazioni predefinite delimitato da punti e virgola. Ad esempio,

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

specifica che viene eseguita prima la destinazione Clean e quindi la destinazione Build.

I progetti importati possono presentare attributi DefaultTargets propri. Il primo attributo DefaultTargets trovato determina quali destinazioni predefinite verranno eseguite.

È possibile eseguire l'override delle destinazioni predefinite tramite la riga di comando. Ad esempio,

msbuild /target:Build;Report

specifica che viene eseguita prima la destinazione Build e quindi la destinazione Report. Quando le destinazioni vengono specificate in questo modo, tutte le destinazioni predefinite vengono ignorate.

Se si specificano sia destinazioni iniziali sia destinazioni predefinite ma nessuna destinazione della riga di comando, MSBuild esegue prima le destinazioni iniziali e quindi le destinazioni predefinite.

Prima destinazione

Se non vi sono destinazioni iniziali, predefinite o della riga di comando, MSBuild esegue la prima destinazione che trova nel file di progetto o in qualsiasi file di progetto importato.

Dipendenze fra destinazioni

Le destinazioni possono descrivere relazioni di dipendenza con altre destinazioni. L'attributo DependsOnTargets indica che una destinazione dipende da altre destinazioni. Ad esempio,

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

indica a MSBuild che la destinazione Serve dipende dalle destinazioni Chop e Cook. Prima di eseguire la destinazione Serve, MSBuild esegue la destinazione Chop e quindi la destinazione Cook.

BeforeTargets e AfterTargets

In MSBuild 4.0 è possibile specificare l'ordine delle destinazioni tramite gli attributi BeforeTargets e AfterTargets.

Si consideri lo script seguente.

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

Per creare una destinazione intermedia Optimize che viene eseguita dopo la destinazione Compile ma prima della destinazione Link, aggiungere la destinazione seguente in qualsiasi punto dell'elemento Project.

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

Determinazione dell'ordine di compilazione delle destinazioni

MSBuild determina l'ordine di compilazione delle destinazioni come segue:

  1. Le destinazioni specificate nella riga di comando dall'opzione /target vengono eseguite. Se non è stata specificata alcuna destinazione, vengono eseguite prima le destinazioni InitialTargets e quindi le destinazioni DefaultTargets. Se non è presente alcuna destinazione InitialTargets o DefaultTargets, viene eseguita la prima destinazione trovata.

  2. L'attributo Condition della destinazione viene valutato. Se l'attributo Condition è presente e risulta essere false, la destinazione non viene eseguita e non influisce sulla build.

  3. Prima che una destinazione venga eseguita, ne vengono eseguite le destinazioni DependsOnTargets.

  4. Prima che una destinazione venga eseguita, vengono eseguite tutte le destinazioni che la indicano nel proprio attributo BeforeTargets.

  5. Prima che una destinazione venga eseguita, viene eseguito un confronto fra i relativi attributi Inputs e Outputs. Se MSBuild determina che esistono file di output non aggiornati rispetto al file o ai file di input corrispondenti, la destinazione viene eseguita. In caso contrario, MSBuild ignora la destinazione.

  6. Dopo che una destinazione viene eseguita o ignorata, vengono eseguite tutte le destinazioni che la indicano nel proprio attributo AfterTargets.

Vedere anche

Concetti

Destinazioni di MSBuild