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
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.
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>
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"
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.
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à.
Definire le destinazioni personalizzate prima o dopo la definizione della proprietà.
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)