如何从MSBuild中导出导入的属性表列表

3

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

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

例子:

<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

另外,如果有人能够创建一个msbuild-batching标签,我会很感激,因为显然我的尝试在除了ItemGroup之外的其他地方进行批处理失败了。我仍然认为这是一个有用的标签。 - Michael Price
1个回答

2
你所尝试的操作并没有一个明显的方法。导入是经过预处理的,将所有内容聚合到单个文件中,它们不像项数组或属性那样成为可稍后引用的数据类型。
语法%(Import.Project)不起作用,因为该语法仅适用于项数组,并且你正在尝试在关键字 Import 上使用它,而这不是填充的项数组。
还要注意,你围绕导入的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>  

感谢您的回复。您在每个属性表中定义一个ItemGroup的解决方案是我之前嗅探到的解决方案。我已经采用了这种技术。虽然在我的一些实验中,当我在导入的项目中时,$(MSBuildThisFile)属性为空,因此我回归到硬编码文件名。在接受您的答案之前,我会等待更多的回复,因为我想看看是否有其他更少维护的技术。 - Michael Price
此外,我将条件放在ImportGroup元素而不是Import元素上的原因是由于Visual Studio中报告的一个错误,它无法正确处理配置开关和有条件的Import元素。在我的环境中,似乎对ImportGroup进行条件化可以解决这个问题。请参见http://msdn.microsoft.com/en-us/library/92x05xfs.aspx上的注释。 - Michael Price

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接