如何:在多个项目文件中使用同一目标
如果您创作了多个 MSBuild 项目文件,可能会发现需要在不同的项目文件中使用相同的任务和目标。 您不需要在每个项目文件中都包含这些任务或目标的完整说明,而是可以在一个单独的项目文件中保存一个目标,然后将该项目导入需要使用该目标的任何其他项目中。
使用 Import 元素
Import 元素用于将一个项目文件插入另一个项目文件中。 导入的项目文件必须是一个有效的 MSBuild 项目文件,并且包含格式良好的 XML。 Project 特性指定导入的项目文件的路径。 有关 Import 元素的更多信息,请参见 Import 元素 (MSBuild)。
导入项目
在导入项目文件中定义的所有属性和项在导入的项目中作为属性和项的参数使用。
使用 Import 元素导入项目。 例如:
<Import Project="MyCommon.targets"/>
在 Import 元素之后定义的所有属性和项要对导入的项目中默认的属性和项的定义进行重写。
计算顺序
当 MSBuild 到达 Import 元素时,在 Import 元素的位置将导入的项目实际插入到导入项目中。 因此,Import 元素的位置可以影响属性和项的值。 了解导入的项目设置和使用了哪些属性和项是很重要的。
项目生成以后,先计算所有属性,再计算所有项。 例如,下面的 XML 定义了导入的项目文件 MyCommon.targets:
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyCommon</Name>
</PropertyGroup>
<Target Name="Go">
<Message Text="Name=$(Name)"/>
</Target>
</Project>
下面的 XML 定义的 MyApp.proj 用于导入 MyCommon.targets:
<Project
DefaultTargets="Go"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyApp</Name>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>
项目生成以后,会显示以下消息:
Name="MyCommon"
因为是先在 MyApp.proj 中定义了属性 Name 然后导入项目,所以,MyCommon.targets 中的 Name 定义将重写 MyApp.proj 中的定义。 如果项目是在定义属性 Name 之前导入的,则相应的生成过程将显示以下消息:
Name="MyApp"
导入项目使用的方法如下
在项目文件中定义的所有属性和项在导入的项目中作为属性和项的参数使用。
导入项目。
在项目文件中定义的所有属性和项要对导入的项目中默认的属性和项的定义进行重写。
示例
下面的代码示例显示第二个代码示例导入的 MyCommon.targets 文件。 这个 .targets 文件计算导入项目中的属性以配置生成。
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
<Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
<appname>$(MSBuildProjectName)</appname>
<PropertyGroup>
<Target Name="Build">
<Csc Sources="hello.cs"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe"/>
</Target>
</Project>
下面的代码示例导入 MyCommon.targets 文件。
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>