我想使用修改后的元数据创建一个新的项目集合。 例如,更改 ClCompile.AdditionalIncludeDirectories 的分隔符。 为此,我首先从AdditionalIncludeDirectories 元数据创建一个项目集合,然后对其进行转换:
<ItemGroup>
<IncludeDirs0 Include="%(ClCompile.AdditionalIncludeDirectories)">
<key>@(ClCompile)</key>
</IncludeDirs0>
</ItemGroup>
<ItemGroup>
<IncludeDirs Include="@(IncludeDirs0 -> '-I %(Identity)', ' ')">
<key>%(IncludeDirs0.key)</key>
</IncludeDirs>
</ItemGroup>
<ItemGroup>
<Compile Include="@(ClCompile)">
<IncludeDirs>@(IncludeDirs)</IncludeDirs>
</Compile>
</ItemGroup>
问题是如何过滤编译项组上的 IncludeDirs,以便每个编译项都有其正确的包含目录。 (这样 ClCompile 标识等于 IncludeDirs 键)。
我尝试添加一个条件,例如:Condition="'%(IncludeDirs.key)'=='%(ClCompile.Identity)'"
但没有任何成功。
我可以直接使用 IncludeDirs: <Message Text="%(IncludeDirs.key) : @(IncludeDirs)"/>
但我觉得这没有捕获要点,因为 Compile 集合应该包含所有元数据。
我在这里错过了什么?
最佳答案
您可以使用一个额外的目标来收集所需的元素。 请参阅MSBuild Batching .
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="1" />
<ClCompile Include="2">
<AdditionalIncludeDirectories>2.1;2.2;2.3</AdditionalIncludeDirectories>
</ClCompile>
</ItemGroup>
<Target Name="TransformClCompile"
Inputs="%(ClCompile.Identity)"
Outputs="_Non_Existent_Item_To_Batch_">
<PropertyGroup>
<IncludeDirs>%(ClCompile.AdditionalIncludeDirectories)</IncludeDirs>
</PropertyGroup>
<ItemGroup>
<IncludeDirs Include="$(IncludeDirs)" />
<Compile Include="@(ClCompile)">
<IncludeDirs>@(IncludeDirs ->'-I %(Identity)', ' ')</IncludeDirs>
</Compile>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="TransformClCompile">
<Message Text="compile %(Compile.Identity) %(Compile.IncludeDirs)" />
</Target>
</Project>
输出:
compile 1
compile 2 -I 2.1 -I 2.2 -I 2.3
关于msbuild - 在msbuild中过滤项目的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016283/