如何从MSBuild转储导入的属性表的列表

时间:2011-10-17 15:25:55

标签: msbuild

我正在构建属性表的层次结构(根据平台和配置有条件地包含许多),我正在尝试编写一组目标,以帮助诊断可能潜入的任何错误。

我想要的是已包含的属性表列表。

示例:

<ImportGroup Condition="$(Configuration.Contains('Debug'))">
  <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup>
<ImportGroup Condition="$(Configuration.Contains('Release'))">
  <Import Project="ps.cpp.config.release.props"/>
</ImportGroup>

<ImportGroup Condition="'$(Platform)' == 'x64'">
  <Import Project="ps.cpp.plat.x64.props"/>
</ImportGroup>
<ImportGroup Condition="'$(Platform)' == 'Win32'">
  <Import Project="ps.cpp.plat.win32.props"/>
</ImportGroup>

这样的目标:

<Target Name="DumpPropertySheets">
  <!-- This doesn't work! -->
  <!-- <Message Text="%(Import.Project)"/> -->
</Target>

使用msbuild test.vcxproj /t:DumpPropertySheets /p:Platform=x64 /p:Configuration:Debug

构建时,这会产生这样的控制台输出
DumpPropertySheets:
  ps.cpp.config.debug.props
  ps.cpp.plat.x64.props

1 个答案:

答案 0 :(得分:1)

没有明显的方法可以做你想要做的事情。导入被预处理以将所有内容聚合到单个文件中,它们不是像项目数组或稍后可以引用的属性的数据类型。

语法%(Import.Project)不起作用,因为该语法仅对项目数组有效,并且您尝试在导入关键字上使用它,该关键字不是填充项目阵列。

另请注意,您对导入周围的ImportGroup元素的使用是可选的(可能有点冗长)。 MSBuild文件中的以下两个构造是等效的......

<ImportGroup Condition="$(Configuration.Contains('Debug'))">
   <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup> 

...和(为了清晰起见,换行)......

<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />

如果您正在尝试诊断属性表导入错误,请不要忘记/ pp命令行开关,它将转储完整的预处理文件。您也可以(至少为您自己的文件)为每个导入项目数组提供唯一的条目,例如

<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />

然后在ps.cpp.config.debug.props内,

<ItemGroup>
   <_Import Include="$(MSBuildThisFile)" />
</ItemGroup>

然后在您的构建中,您可以在某种程度上获得您正在寻找的内容,

<Target Name="DumpPropertySheets">
   <!-- This does work! -->
   <Message Text="%(_Import.Identity)" />
</Target>