如何:使用不同选项生成相同的源文件
当生成项目时,您经常使用不同的生成选项来编译相同的元素。例如,可以创建带有符号信息的调试版本,也可以创建不带有符号信息但启用了优化的发布版本。还可以生成在特定平台(如 x86 或 x64)上运行的项目。在以上所有情况下,大部分生成选项保持不变,只对几个选项进行更改以控制生成配置。对于 MSBuild,可以使用属性和条件来创建不同的生成配置。
使用属性修改项目
Property 元素定义一个在项目文件中多次引用的变量,如临时目录的位置;或者设置在多个配置中使用的属性值,如调试版本和发布版本。有关属性的更多信息,请参见 MSBuild 属性。
可以使用属性更改生成配置,而不必更改项目文件。使用 Property 元素和 PropertyGroup 元素的 Condition 特性可以更改属性值。有关 MSBuild 条件的更多信息,请参见 MSBuild 条件。
基于一个属性设置一组属性
在 PropertyGroup 元素中使用 Condition 特性,如下所示:
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'"> <DebugType>full</DebugType> <Optimize>no</Optimize> </PropertyGroup>
基于一个属性定义另一个属性
在 Property 元素中使用 Condition 特性,如下所示:
<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
在命令行上指定属性
如果您编写的项目文件接受多种配置,那么,您需要具备以下功能,即只要生成项目就可以对这些配置进行更改。MSBuild 为您提供了这一功能,您可以使用 /property 或 /p 开关在命令行处指定属性。
在命令行上设置项目属性
对属性和属性值使用 /property 开关。例如:
msbuild file.proj /property:Flavor=Debug
- 或 -
Msbuild file.proj /p:Flavor=Debug
在命令行上指定多个项目属性
可以对属性和属性值多次使用 /property 或 /p 开关,也可以使用一个 /property 或 /p 开关并用分号 (;) 将多个属性分开。例如:
msbuild file.proj /p:Flavor=Debug;Platform=x86
- 或 -
msbuild file.proj /p:Flavor=Debug /p:Platform=x86
环境变量也被视为属性并由 MSBuild 自动合并。有关使用环境变量的更多信息,请参见如何:在生成中使用环境变量。
在命令行上指定的属性值优先于在项目文件中为同一属性设置的任何值,而在项目文件中该值又优先于环境变量中相应的值。
使用 project 标记,的 TreatAsLocalProperty 属性可以更改此行为。对列表与该属性的属性名称,在命令行上指定的属性值不优先于在项目文件中的值。可以找到示例本主题后面。
示例
下面的代码示例,“hello world”项目,包含可用于创建调试版本和发布版本的两个新属性组。
若要生成此项目的调试版本,请键入:
msbuild consolehwcs1.proj /p:flavor=debug
若要生成此项目的零售版本,请键入:
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>
下面的示例演示如何使用 TreatAsLocalProperty 属性。Color 属性具有 Blue 在项目文件和 Green 的值在命令行。在项目标记的 TreatAsLocalProperty="Color",命令行属性 (Green) 不重写项目文件的属性 (Blue) 中定义。
若要生成项目,请输入以下命令:
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
-->