我正在构建属性表的层次结构(根据平台和配置有条件地包含许多),我正在尝试编写一组目标,以帮助诊断可能潜入的任何错误。
我想要的是已包含的属性表列表。
示例:
<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
答案 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>