Condividi tramite


Procedura: estendere il processo di compilazione di Visual Studio

Il processo di compilazione di Visual Studio è definito da una serie di file con estensione targets di MSBuild che vengono importati nel file di progetto. Uno di questi file importati, Microsoft.Common.targets, può essere esteso per consentire l'esecuzione di attività personalizzate in diversi punti del processo di compilazione. In questo argomento vengono illustrati due metodi che è possibile utilizzare per estendere il processo di compilazione di Visual Studio:

  • Override di specifiche destinazioni predefinite definite in Microsoft.Common.targets.

  • Override delle proprietà "DependsOn" definite in Microsoft.Common.targets.

Override di destinazioni predefinite

Il file Microsoft.Common.targets contiene un insieme di destinazioni predefinite vuote che vengono chiamate prima e dopo alcune delle destinazioni più importanti nel processo di compilazione. Ad esempio, MSBuild chiama la destinazione BeforeBuild prima della destinazione CoreBuild principale e la destinazione AfterBuild dopo la destinazione CoreBuild. Per impostazione predefinita, le destinazioni vuote in Microsoft.Common.targets non eseguono alcuna operazione, ma è possibile eseguire l'override del comportamento predefinito specificando le destinazioni desiderate in un file di progetto che importa Microsoft.Common.targets. In questo modo sarà possibile utilizzare le attività di MSBuild per disporre di un controllo maggiore sul processo di compilazione.

Per eseguire l'override di una destinazione predefinita

  1. In Microsoft.Common.targets identificare una destinazione predefinita di cui si desidera eseguire l'override. Nella tabella che segue è riportato l'elenco completo delle destinazioni di cui è possibile eseguire l'override senza problemi.

  2. Definire le destinazioni alla fine del file di progetto, immediatamente prima del tag </Project>. Di seguito è riportato un esempio:

    <Project>
        ...
        <Target Name="BeforeBuild">
            <!-- Insert tasks to run before build here -->
        </Target>
        <Target Name="AfterBuild">
            <!-- Insert tasks to run after build here -->
        </Target>
    </Project>
    
  3. Compilare il file di progetto.

Nella tabella seguente sono indicate tutte le destinazioni in Microsoft.Common.targets di cui è possibile eseguire l'override senza problemi.

Target Name

Descrizione

BeforeCompile, AfterCompile

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo la compilazione principale. La maggior parte delle personalizzazioni avviene in una di queste due destinazioni.

BeforeBuild, AfterBuild

Le attività inserite in una di queste destinazioni verranno eseguite prima o dopo qualsiasi altra attività nella compilazione.

Nota

Le destinazioni BeforeBuild e AfterBuild sono già definite nei commenti alla fine della maggior parte dei file di progetto.Questo agevola l'aggiunta di eventi di pre-compilazione e post-compilazione al file di progetto.

BeforeRebuild, AfterRebuild

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo il richiamo della funzionalità di base per la ricompilazione. L'ordine di esecuzione delle destinazioni in Microsoft.Common.targets è: BeforeRebuild, Clean, Build e quindi AfterRebuild.

BeforeClean, AfterClean

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo il richiamo della funzionalità di base per la pulitura.

BeforePublish, AfterPublish

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo il richiamo della funzionalità di base per la pubblicazione.

BeforeResolveReference, AfterResolveReferences

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo la risoluzione dei riferimenti all'assembly.

BeforeResGen, AfterResGen

Le attività inserite in una di queste destinazioni vengono eseguite prima o dopo la generazione delle risorse.

Override delle proprietà "DependsOn"

L'override delle destinazioni predefinite costituisce un modo semplice per estendere il processo di compilazione. Tuttavia, poiché MSBuild valuta la definizione delle destinazioni in modo sequenziale, non è possibile evitare che un altro progetto che importa il progetto in questione esegua l'override delle destinazioni di cui è già stato eseguito l'override. Di conseguenza, ad esempio, l'ultima destinazione AfterBuild definita nel file di progetto, al termine dell'importazione di tutti gli altri progetti, sarà quella utilizzata durante la compilazione.

Per evitare override di destinazioni non desiderati, è possibile eseguire l'override delle proprietà "DependsOn" utilizzate negli attributi DependsOnTargets nel file Microsoft.Common.targets. Ad esempio, nella destinazione Build il valore dell'attributo DependsOnTargets è "$(BuildDependsOn)". Tenere presente quanto segue:

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>

Questa parte di codice XML indica che la destinazione Build può essere eseguita solo dopo l'esecuzione di tutte le destinazioni specificate nella proprietà BuildDependsOn. La proprietà BuildDependsOn è definita come segue:

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

È possibile eseguire l'override di questo valore di proprietà dichiarando un'altra proprietà denominata BuildDependsOn alla fine del file di progetto. L'inclusione della proprietà BuildDependsOn precedente nella nuova proprietà consente di aggiungere nuove destinazioni all'inizio e alla fine dell'elenco di destinazioni. Di seguito è riportato un esempio:

<PropertyGroup>
    <BuildDependsOn>
        MyCustomTarget1;
        $(BuildDependsOn);
        MyCustomTarget2
    </BuildDependsOn>
</PropertyGroup>

<Target Name="MyCustomTarget1">
    <Message Text="Running MyCustomTarget1..."/>
</Target>
<Target Name="MyCustomTarget2">
    <Message Text="Running MyCustomTarget2..."/>
</Target>

I progetti che importano i file di progetto possono eseguire l'override di queste proprietà senza sovrascrivere le personalizzazioni effettuate in precedenza.

Per eseguire l'override della proprietà "DependsOn"

  1. In Microsoft.Common.targets identificare una proprietà "DependsOn" predefinita di cui si desidera eseguire l'override. Nella tabella che segue è riportato un elenco delle proprietà "DependsOn" comunemente sottoposte a override.

  2. Definire un'altra istanza della proprietà o delle proprietà alla fine del file di progetto. Includere la proprietà originale, ad esempio $(BuildDependsOn), nella nuova proprietà.

  3. Definire le destinazioni personalizzate prima o dopo la definizione della proprietà.

  4. Compilare il file di progetto.

Proprietà "DependsOn" comunemente sottoposte a override

Nome proprietà

Descrizione

BuildDependsOn

Proprietà di cui eseguire l'override se si desidera inserire destinazioni personalizzate prima o dopo l'intero processo di compilazione.

CleanDependsOn

Proprietà di cui eseguire l'override se si desidera pulire l'output del processo di compilazione personalizzato.

CompileDependsOn

Proprietà di cui eseguire l'override se si desidera inserire processi personalizzati prima o dopo la fase di compilazione.

Vedere anche

Riferimenti

File con estensione targets di MSBuild

Concetti

Integrazione di Visual Studio (MSBuild)

Altre risorse

Concetti relativi a MSBuild