Procedura: compilare gli stessi file di origine con opzioni diverse
Quando si compilano progetti, vengono spesso le stesse componenti con diverse opzioni di compilazione. È ad esempio possibile creare una build di debug con informazioni sui simboli o una build di rilascio senza informazioni sui simboli, ma con le ottimizzazioni attivate. È inoltre possibile compilare un progetto da eseguire su una piattaforma specifica, ad esempio x86 o x64. In tutti questi casi, la maggior parte delle opzioni di compilazione rimane invariata. Vengono modificate solo alcune opzioni per controllare la configurazione della build. MSBuild consente di utilizzare proprietà e condizioni per creare varie configurazioni della build.
Utilizzo delle proprietà per modificare i progetti
L'elemento Property definisce una variabile a cui si fa riferimento più volte in un file di progetto, ad esempio il percorso di una directory temporanea, o che consente di impostare i valori delle proprietà utilizzate in varie configurazioni, quali build di debug e di rilascio. Per ulteriori informazioni sulle proprietà, vedere Proprietà di MSBuild.
Le proprietà possono essere utilizzate per modificare la configurazione di una compilazione senza dover apportare modifiche al file di progetto. L'attributo Condition dell'elemento Property e dell'elemento PropertyGroup consente di modificare il valore delle proprietà. Per ulteriori informazioni sulle condizioni di MSBuild, vedere Condizioni di MSBuild.
Per impostare un gruppo di proprietà basate su un'altra proprietà
Utilizzare un attributo Condition di un elemento PropertyGroup simile a quello riportato di seguito:
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'"> <DebugType>full</DebugType> <Optimize>no</Optimize> </PropertyGroup>
Per definire una proprietà basata su un'altra proprietà
Utilizzare un attributo Condition di un elemento Property simile a quello riportato di seguito:
<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
Specifica delle proprietà sulla riga di comando
Dopo che il file di progetto è stato scritto per accettare più configurazioni, è necessario avere la possibilità di modificare tali configurazioni quando si compila il progetto. MSBuild offre questa possibilità consentendo di specificare le proprietà alla riga di comando utilizzando l'opzione /property o /p.
Per impostare una proprietà di progetto sulla riga di comando
Utilizzare l'opzione /property con la proprietà e il relativo valore. Ad esempio:
msbuild file.proj /property:Flavor=Debug
- oppure -
Msbuild file.proj /p:Flavor=Debug
Per specificare più proprietà di progetto sulla riga di comando
Utilizzare più volte l'opzione /property o /p con la proprietà e i relativi valori oppure utilizzare una sola volta l'opzione /property o /p e separare le varie proprietà con punti e virgola (;). Ad esempio:
msbuild file.proj /p:Flavor=Debug;Platform=x86
-oppure-
msbuild file.proj /p:Flavor=Debug /p:Platform=x86
Anche le variabili di ambiente sono considerate come proprietà e vengono automaticamente incorporate da MSBuild. Per ulteriori informazioni sull'utilizzo delle variabili di ambiente, vedere Procedura: utilizzare le variabili di ambiente in una compilazione.
Il valore della proprietà specificato sulla riga di comando ha la precedenza su qualsiasi altro valore impostato per la stessa proprietà nel file di progetto. A sua volta, il valore indicato nel file di progetto ha la precedenza sul valore della variabile di ambiente.
È possibile modificare questo comportamento utilizzando l'attributo TreatAsLocalProperty in un tag di progetto. Per i nomi delle proprietà che vengono elencati con tale attributo, il valore della proprietà specificato nella riga di comando non ha la precedenza sul valore nel file di progetto. È possibile trovare successivamente un esempio di questo argomento.
Esempio
Nell'esempio di codice, il progetto “Hello World„, contiene due nuovi gruppi di proprietà che possono essere utilizzati per creare una build di debug e una build di rilascio.
Per compilare la versione di debug del progetto, digitare:
msbuild consolehwcs1.proj /p:flavor=debug
Per compilare la versione finale del progetto, digitare:
msbuild consolehwcs1.proj /p:flavor=retail
<Project DefaultTargets = "Compile"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- Sets the default flavor of an environment variable called
Flavor is not set or specified on the command line -->
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
</PropertyGroup>
<!-- Define the DEBUG settings -->
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
<DebugType>full</DebugType>
<Optimize>no</Optimize>
</PropertyGroup>
<!-- Define the RETAIL settings -->
<PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
<DebugType>pdbonly</DebugType>
<Optimize>yes</Optimize>
</PropertyGroup>
<!-- Set the application name as a property -->
<PropertyGroup>
<appname>HelloWorldCS</appname>
</PropertyGroup>
<!-- Specify the inputs by type and file name -->
<ItemGroup>
<CSFile Include = "consolehwcs1.cs"/>
</ItemGroup>
<Target Name = "Compile">
<!-- Run the Visual C# compilation using input files
of type CSFile -->
<CSC Sources = "@(CSFile)"
DebugType="$(DebugType)"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe" >
<!-- Set the OutputAssembly attribute of the CSC
task to the name of the executable file that is
created -->
<Output TaskParameter="OutputAssembly"
ItemName = "EXEFile" />
</CSC>
<!-- Log the file name of the output file -->
<Message Text="The output file is @(EXEFile)"/>
</Target>
</Project>
Nell'esempio seguente viene illustrato come utilizzare l'attributo TreatAsLocalProperty. La proprietà Color ha un valore Blue nel file di progetto e Green nella riga di comando. Con TreatAsLocalProperty="Color" il tag di progetto, la proprietà della riga di comando (Green) non esegue l'override della proprietà che sia definita nel file di progetto (Blue).
Per compilare il progetto, il comando seguente:
msbuild colortest.proj /t:go /property:Color=Green
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" TreatAsLocalProperty="Color">
<PropertyGroup>
<Color>Blue</Color>
</PropertyGroup>
<Target Name="go">
<Message Text="Color: $(Color)" />
</Target>
</Project>
<!--
Output with TreatAsLocalProperty="Color" in project tag:
Color: Blue
Output without TreatAsLocalProperty="Color" in project tag:
Color: Green
-->