在多个项目文件中使用同一目标
如果你创建了若干个 MSBuild 项目文件后,或许发现自己可能需要在不同项目文件中使用相同的任务和目标。 无需将这些任务或目标的完整说明包含在每个项目文件中,相反,你可以将目标保存在单独的项目文件中,然后将该项目导入任何需要使用该目标的其他项目。
使用 Import 元素
Import
元素用于将一个项目文件插入另一个项目文件中。 导入的项目文件必须是有效的 MSBuild 项目文件,并包含格式标准的 XML。 Project
属性指定已导入的项目文件的路径。 有关 Import
元素的详细信息,请参阅 Import 元素 (MSBuild)。
导入项目
在正在导入的项目文件中,定义所有在已导入项目中作为属性和项的参数使用的属性和项。
使用
Import
元素导入项目。 例如:<Import Project="MyCommon.targets"/>
在
Import
元素之后定义所有属性和项,它们必须替代已导入项目中属性和项的默认定义。
计算顺序
当 MSBuild 到达 Import
元素后,已导入项目将有效地插入位于 Import
元素所处位置的正在导入的项目中。 因此,Import
元素的位置可能会影响属性和项的值。 请务必了解已导入项目所设置的属性和项,以及已导入项目所使用的属性和项。
当项目生成时,将首先评估所有属性,然后对项进行评估。 例如,下面的 XML 定义了已导入的项目文件 MyCommon.targets :
<Project xmlns="http://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="http://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="MyApp"
在导入项目时使用以下方法
在项目文件中,定义所有在已导入项目中作为属性和项的参数使用的属性和项。
导入项目。
在项目文件中定义所有属性和项,它们必须替代已导入项目中属性和项的默认定义。
示例 1
下面的代码示例演示了第二个代码示例所导入的 MyCommon.targets 文件 。 .targets 文件将评估正在导入的项目中的属性,以配置生成 。
<Project xmlns="http://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>
示例 2
下面的代码示例将导入 MyCommon.targets 文件 。
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>