将一个项目文件的内容导入另一个项目文件。
<Import Project="ProjectPath" Condition="‘String A‘==‘String B‘" />
以下几节描述了特性、子元素和父元素。
特性
特性 |
说明 |
---|---|
Project |
必需的特性。 要导入的项目文件的路径。 该路径可以包含通配符。 匹配的文件按排序顺序导入。 通过使用此功能,可以向项目添加代码,只是通过将代码文件添加到目录。 |
Condition |
可选特性。 待评估的条件。 有关更多信息,请参见 MSBuild 条件。 |
子元素
无
父元素
元素 |
说明 |
---|---|
MSBuild 项目文件必需的根元素。 |
|
包含在可选条件下进行分组的 Import 元素的集合。 |
通过使用 Import 元素,可以重用许多项目文件通用的代码。 这样更易于维护代码,因为对共享代码所做的任何更新将传播到导入它的所有项目。
按照约定,共享的导入项目文件另存为 .targets 文件,但属于标准的 MSBuild 项目文件。 MSBuild 不会阻止您导入具有其他文件扩展名的项目,但是,为了保持一致性,建议使用 .targets 文件扩展名。
在导入的项目中,相对路径都被解释为相对于导入项目的目录。 因此,如果将同一个项目文件导入另外几个位于不同位置的项目文件中,则对于每个导入后的项目,其文件中的相对路径将具有不同的解释。
将基于导入项目文件,为被导入项目中引用的与项目文件有关的所有 MSBuild 保留属性(例如 MSBuildProjectDirectory 和 MSBuildProjectFile)赋值。
如果被导入项目没有 DefaultTargets 特性,将会按照导入顺序检查被导入项目,并使用最先发现的 DefaultTargets 特性的值。 例如,如果 ProjectA 导入 ProjectB 和 ProjectC(按照该顺序),而 ProjectB 导入 ProjectD,MSBuild 将依次查找 ProjectA、ProjectB、ProjectD 和 ProjectC 上指定的 DefaultTargets。
被导入项目的架构与标准项目完全相同。 虽然 MSBuild 可以生成被导入项目,但可能性不大,因为被导入项目通常不包含与要设置的属性或目标的运行顺序有关的信息。 被导入项目依赖于导入项目来提供该信息。
说明 |
---|
在命令行 MSBuild 中使用条件导入语句时,不能将这些语句用于在 Visual Studio 集成开发环境 (IDE) 中的 MSBuild。 通过使用在加载项目时设置的配置和平台值计算条件导入。如果随后进行的更改需要重新计算项目文件中的条件(例如,更改平台),则 Visual Studio 重新计算属性和项目的条件,但不重新计算导入的条件。 由于不重新计算导入条件,因此将跳过导入。 若要解决此问题,请在 .targets 文件中放置条件导入或在条件块(如Choose 元素 (MSBuild) 块)中放置代码。 |
通配符
在 .NET Framework 4 中,MSBuild 允许在项目特性中使用通配符。 使用通配符时,将排序找到的所有匹配项(对于可重复性),然后以该顺序导入它们,如同该顺序是显式设置的。
如果您想要提供可扩展性点,以便其他人可以导入文件,而无需将文件名显式添加到导入文件,那么这是非常有用的。 为此,Microsoft.Common.Targets 在文件顶部包含下面的行。
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore\*" Condition="‘$(ImportByWildcardBeforeMicrosoftCommonTargets)‘ == ‘true‘ and exists(‘$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore‘)"/>
下面的示例演示拥有几个项和属性并导入通用项目文件的项目。
<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <resourcefile>Strings.resx</resourcefile> <compiledresources> $(O)\$(MSBuildProjectName).Strings.resources </compiledresources> </PropertyGroup> <ItemGroup> <CSFile Include="*.cs" /> <Reference Include="System" /> <Reference Include="System.Data" /> </ItemGroup> <Import Project="$(CommonLocation)\General.targets" /> </Project>