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

如何从MSBuild转储导入的属性表列表,msbuild,Msbuild,我正在构建一个属性表的层次结构(许多属性表是根据平台和配置有条件地包含的),并试图编写一组目标,以帮助诊断可能潜入的任何错误 我想要的是一份已包含的财产清单 例如: <ImportGroup Condition="$(Configuration.Contains('Debug'))"> <Import Project="ps.cpp.config.debug.props"/> </ImportGroup> <ImportGroup Condition

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

我想要的是一份已包含的财产清单

例如:

<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>

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

语法%(Import.Project)不起作用,因为该语法仅对项数组有效,并且您正试图在Import关键字上使用它,该关键字不是填充的项数组

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

<ImportGroup Condition="$(Configuration.Contains('Debug'))">
   <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup> 
然后在以后的构建中,在某种程度上,你可以通过

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


另外,我希望有人能够创建msbuild批处理标记,因为我尝试对ItemGroup以外的对象进行批处理显然失败了。我仍然认为这是一个有用的标签。谢谢你的回复。您在每个属性表中定义ItemGroup的解决方案就是我以前发现的解决方案。目前我已经开始使用这种技术。尽管在我的一些实验中,当我在导入的项目中时,$(MSBuildThisFile)属性是空的,所以我恢复到硬编码文件名。在我接受你的回答之前,我会等待更多的回复,因为我想看看是否有其他人有任何维护较少的技术。另外,我之所以将条件放在ImportGroup元素而不是Import元素上,是因为VisualStudio中报告了一个错误,它无法正确处理配置开关和条件化导入元素。似乎条件化ImportGroup在我的环境中起作用。请参阅
<ImportGroup Condition="$(Configuration.Contains('Debug'))">
   <Import Project="ps.cpp.config.debug.props"/>
</ImportGroup> 
<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />
<Import
   Condition="$(Configuration.Contains('Debug'))"
   Project="ps.cpp.config.debug.props" 
   />
<ItemGroup>
   <_Import Include="$(MSBuildThisFile)" />
</ItemGroup>
<Target Name="DumpPropertySheets">
   <!-- This does work! -->
   <Message Text="%(_Import.Identity)" />
</Target>