过滤项';msbuild中的元数据
我想用修改过的元数据创建一个新的项目集合。 例如,更改ClCompile.AdditionalIncludeDirectories的分隔符。 为此,我首先从AdditionalIncludeDirectories元数据创建一个项集合,然后转换它:过滤项';msbuild中的元数据,msbuild,Msbuild,我想用修改过的元数据创建一个新的项目集合。 例如,更改ClCompile.AdditionalIncludeDirectories的分隔符。 为此,我首先从AdditionalIncludeDirectories元数据创建一个项集合,然后转换它: <ItemGroup> <IncludeDirs0 Include="%(ClCompile.AdditionalIncludeDirectories)"> <key>@(ClCompile)</k
<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>
@(ClCompile)
%(包括IRS0.钥匙)
@(包括IRS)
问题是如何在编译项组上过滤includedir,以便每个编译项都有其正确的include dir。(以便ClCompile标识等于IncludeDirs键)。
我已尝试添加一个条件,例如:condition=“”%(IncludeDirs.key)==”%(ClCompile.Identity)“
,但没有成功。我可以直接使用IncludeDirs:
,但我觉得这没有抓住要点,因为编译集合应该包含所有元数据
我错过了什么?您可以通过一个额外的目标来收集所需物品。 看
在4.0+中,有一些方法可以使用属性函数更简洁地实现这一点
<?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="Build" >
<Message Text="compile %(ClCompile.Identity)" Condition="'%(ClCompile.AdditionalIncludeDirectories)' ==''"/>
<Message Text="compile %(ClCompile.Identity) /I $([System.String]::Join(' /I ', $([System.Text.RegularExpressions.Regex]::Split('%(ClCompile.AdditionalIncludeDirectories)', ';'))))" Condition="'%(ClCompile.AdditionalIncludeDirectories)' !=''"/>
</Target>
</Project>
虽然没那么漂亮,但我觉得好一点。必须使用Regex.Split而不是String.Split,因为后者需要一个拆分器数组,这有点棘手
我认为MSBuild活页夹需要一些改进
Dan(msbuild)而不是我们在Microsoft.targets文件中使用的?cleaner模式是:当然,如果已经存在条件,那么“你”和“它”。呃,我只是不知道如何使代码在注释中看起来正确。我相信,这个答案是不正确的,令人沮丧。这是我在尝试使用“cleaner”模式时得到的结果:错误MSB4116:“CopySourceAsContent”目标上的条件“'%(SupportedFramework.Identity)!=””引用了项元数据。对项元数据的引用在目标条件中并不都是欠的,除非它们是项转换的一部分。
compile 1
compile 2 -I 2.1 -I 2.2 -I 2.3
<?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="Build" >
<Message Text="compile %(ClCompile.Identity)" Condition="'%(ClCompile.AdditionalIncludeDirectories)' ==''"/>
<Message Text="compile %(ClCompile.Identity) /I $([System.String]::Join(' /I ', $([System.Text.RegularExpressions.Regex]::Split('%(ClCompile.AdditionalIncludeDirectories)', ';'))))" Condition="'%(ClCompile.AdditionalIncludeDirectories)' !=''"/>
</Target>
</Project>
compile 1
compile 2 /I 2.1 /I 2.2 /I 2.3