我想使用修改后的元数据创建一个新的项目集合。
例如,更改 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批处理 http://msdn.microsoft.com/en-us/library/ms171473.aspx.
<?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>
Output:
compile 1
compile 2 -I 2.1 -I 2.2 -I 2.3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)