Condividi tramite


Destinazioni di MSBuild

Aggiornamento: novembre 2007

Le destinazioni raggruppano le attività in un determinato ordine e consentono di richiamare le sezioni del processo di generazione dalla riga di comando. Le destinazioni vengono spesso raggruppate in sezioni logiche, per consentire l'espansione del file di progetto e garantire una maggiore leggibilità. Una destinazione, ad esempio, può eliminare tutti i file nella directory di output per preparare la generazione, mentre un'altra può compilare gli input per il progetto ed inserirli nella directory vuota.

Dichiarazione delle destinazioni nel file di progetto

Le destinazioni vengono dichiarate nel file di progetto con l'elemento Target. Il codice XML riportato di seguito, ad esempio, crea una destinazione chiamata Compile, che a sua volta chiama l'attività Csc con l'insieme di elementi Compile.

<Target Name="Compile>
    <Csc Sources="@(Compile)" />
</Target>

Le destinazioni possono inoltre utilizzare l'attributo Condition. Se la condizione specificata restituisce False, la destinazione non verrà eseguita e il modulo di gestione di MSBuild non eseguirà le destinazioni specificate nell'attributo DependsOnTargets. Per ulteriori informazioni sulle condizioni, vedere Condizioni di MSBuild.

Analisi delle dipendenze

In caso di destinazioni appartenenti a scenari più avanzati è possibile descrivere le relazioni reciproche ed eseguire un'analisi delle dipendenze, che consente di ignorare intere sezioni del processo di generazione se la destinazione si rivela già aggiornata. È possibile dichiarare le destinazioni che devono essere eseguite prima di una destinazione specifica utilizzando l'attributo DependsOnTargets. Quando viene eseguita una destinazione, il modulo di gestione di MSBuild eseguirà innanzitutto automaticamente tutte le destinazioni elencate in questo attributo. Per ulteriori informazioni, vedere Procedura: eseguire la compilazione incrementale.

Nota:

Una destinazione non verrà mai eseguita due volte nel corso di un'unica generazione. Una volta eseguita, si presuppone che l'utilizzo di una destinazione sia concluso e che tale destinazione non venga più eseguita, anche se da essa dipende una destinazione successiva della generazione.

Suggerimenti

La suddivisione del file di progetto in questo modo permette di modificare alcune sezioni del file senza influenzarne altre. Ad esempio, un modo per generare un progetto con risorse è quello di inserire le attività GenerateResource e Csc nella medesima destinazione, ad esempio:

<Target Name="Build">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Con questo approccio il progetto viene generato nel modo richiesto ma la destinazione diventa più grande e inflessibile. Se in un secondo tempo si desidera aggiungere altre attività da eseguire tra GenerateResource e Csc, l'inserimento di tutte queste attività in un'unica destinazione renderebbe il file di progetto molto difficile da leggere. Inoltre, la creazione di destinazioni di grandi dimensioni contenenti molte attività rende difficile la corretta esecuzione di generazioni incrementali, ossia quelle generazioni in cui vengono rigenerate soltanto le destinazioni che non sono state generate in precedenza o le destinazioni obsolete. Le destinazioni di grandi dimensioni, inoltre, non consentono l'esecuzione di destinazioni per eseguire attività specifiche. Nell'esempio precedente, non c'è modo di generare le risorse senza compilazione.

Un modo migliore per creare un file di progetto è quello di utilizzare più destinazioni e di esprimere esplicitamente le dipendenze reciproche. Questo approccio permette inoltre di eseguire qualsiasi destinazione separatamente e di eseguire una piccola serie di attività anziché un lungo elenco di attività in un'unica destinazione ogni volta che si effettua la generazione. Nell'esempio riportato di seguito, ogni attività è in una destinazione separata e l'attributo DependsOnTargets specifica che la destinazione Resources deve essere eseguita prima di poter eseguire la destinazione Build.

<Target Name="Resources">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
</Target>

<Target Name="Build" DependsOnTargets="Resources">
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

Vedere anche

Attività

Procedura: specificare quale destinazione compilare per prima

Procedura: utilizzare la stessa destinazione in più file di progetto

Concetti

Cenni preliminari su MSBuild

Altre risorse

Concetti relativi a MSBuild