Compilar os mesmos arquivos de origem com opções diferentes
Quando compila projetos, frequentemente você compila os mesmos componentes com opções de build diferente. Por exemplo, é possível criar um build de depuração com informações de símbolo ou um build de versão sem nenhuma informação de símbolo, mas com otimizações habilitadas. Ou você pode compilar um projeto para ser executado em uma plataforma específica, como x86 ou x64. Em todos esses casos, a maioria das opções de build permanecem as mesmas, apenas algumas opções são alteradas para controlar a configuração de build. Com o MSBuild, você usa propriedades e condições para criar as diferentes configurações de build.
Usar propriedades para controlar configurações de build
O elemento Property
define uma variável que é referenciada várias vezes em um arquivo de projeto, como o local de um diretório temporário ou para definir os valores de propriedades que são usadas em várias configurações, como um build de Depuração e um build de Versão. Para obter mais informações sobre propriedades, confira Propriedades do MSBuild.
Você pode usar propriedades para alterar a configuração de seu build sem precisar alterar o arquivo de projeto. O atributo Condition
do elemento Property
e do elemento PropertyGroup
permite alterar o valor de propriedades. Para obter mais informações sobre as condições do MSBuild, confira Condições.
Para definir um grupo de propriedades que dependa de outra propriedade
Use um atributo
Condition
em um elementoPropertyGroup
, semelhante ao seguinte:<PropertyGroup Condition="'$(Flavor)'=='DEBUG'"> <DebugType>full</DebugType> <Optimize>no</Optimize> </PropertyGroup>
Para definir uma propriedade que dependa de outra propriedade
Use um atributo
Condition
em um elementoProperty
, semelhante ao seguinte:<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
Especificar propriedades na linha de comando
Quando o arquivo de projeto é escrito para aceitar várias configurações, você precisa ter a capacidade de alterar essas configurações sempre que compilar o projeto. O MSBuild fornece essa capacidade, permitindo que propriedades sejam especificadas na linha de comando usando a opção -property ou -p.
Para definir uma propriedade de projeto na linha de comando
Use a opção -property com a propriedade e o valor da propriedade. Por exemplo:
msbuild file.proj -property:Flavor=Debug
ou
Msbuild file.proj -p:Flavor=Debug
Para especificar mais de uma propriedade de projeto na linha de comando
Use a opção -property ou -p várias vezes com a propriedade e os valores de propriedade ou use uma opção -property ou -p e separe várias propriedades com ponto e vírgula (;). Por exemplo:
msbuild file.proj -p:Flavor=Debug;Platform=x86
ou
msbuild file.proj -p:Flavor=Debug -p:Platform=x86
Variáveis de ambiente também são tratadas como propriedades e são incorporadas automaticamente pelo MSBuild. Para obter mais informações sobre como usar variáveis de ambiente, confira Como usar variáveis de ambiente em um build.
O valor da propriedade especificado na linha de comando tem precedência sobre qualquer valor definido para a mesma propriedade no arquivo de projeto e o valor no arquivo de projeto tem precedência sobre o valor em uma variável de ambiente.
É possível alterar esse comportamento usando o atributo
TreatAsLocalProperty
em uma marca de projeto. Para nomes de propriedades listados com esse atributo, o valor da propriedade especificado na linha de comando não tem precedência sobre o valor no arquivo de projeto. Veja um exemplo mais adiante neste tópico.
Exemplo 1
O exemplo de código seguinte, o projeto "Hello World", contém dois novos grupos de propriedade que podem ser usados para criar um build de Depuração e um build de Versão.
Para compilar a versão de depuração do projeto, digite:
msbuild consolehwcs1.proj -p:flavor=debug
Para compilar a versão comercial do projeto, digite:
msbuild consolehwcs1.proj -p:flavor=retail
<Project DefaultTargets = "Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Sets the default flavor if 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>
Exemplo 2
O exemplo a seguir mostra como usar o atributo TreatAsLocalProperty
. A propriedade Color
tem um valor de Blue
no arquivo de projeto e Green
na linha de comando. Com TreatAsLocalProperty="Color"
na marca de projeto, a propriedade de linha de comando (Green
) não substitui a propriedade definida no arquivo de projeto (Blue
).
Para compilar o projeto, digite o seguinte comando:
msbuild colortest.proj -t:go -property:Color=Green
<Project xmlns="http://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
-->