过滤项';msbuild中的元数据

过滤项';msbuild中的元数据,msbuild,Msbuild,我想用修改过的元数据创建一个新的项目集合。 例如,更改ClCompile.AdditionalIncludeDirectories的分隔符。 为此,我首先从AdditionalIncludeDirectories元数据创建一个项集合,然后转换它: <ItemGroup> <IncludeDirs0 Include="%(ClCompile.AdditionalIncludeDirectories)"> <key>@(ClCompile)</k

我想用修改过的元数据创建一个新的项目集合。 例如,更改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>

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