MSBUILD对ItemGroup中的重复项进行操作

时间:2013-11-07 12:09:23

标签: msbuild

我有一个ItemGroup,其中包含一些彼此重复的Items。我想对ItemGroup中所有Items的修改版本执行任务。但是,到目前为止,我还没有找到一种不删除重复项目的方法。

这样的存在吗?

<ItemGroup>
  <MyMessage Include="foo"  />
  <MyMessage Include="bar"  />
  <MyMessage Include="baz"  />
  <MyMessage Include="foo"  />
  <MyMessage Include="baz"  />
  <MyMessage Include="baz"  />
</ItemGroup>

<Target Name="DemoBug">
  <Message Importance="High" Text="FIRST VERSION USING ItemGroup ..."/>
  <Message Importance="High" Text="@(MyMessage)"/>
  <Message Importance="High" Text="SECOND VERSION USING Batching and Metadata ..."/>
  <Message Importance="High" Text="someprefix;%(MyMessage.Identity);somesuffix"/>
</Target>

在上面的示例中,FIRST VERSION输出包含其中的所有Items,但仅在Items的连接值上执行了一次Message任务。所以这根本不是我想要的。

5>  FIRST VERSION USING ItemGroup ...
5>  foo;bar;baz;foo;baz;baz

SECOND VERSION正在执行Message任务几次,就像我想要的那样,但它正在剥离重复项,我不希望它这样做。

5>  SECOND VERSION USING Batching and Metadata ...
5>  someprefix;foo;somesuffix
5>  someprefix;bar;somesuffix
5>  someprefix;baz;somesuffix

我想要做的根本不可能(在这种情况下,可能是时候为我的任务切换到PowerShell了),还是有一些合理的方法可以做到这一点?

(在我的实际任务中,Items来自ReadLinesFromFile,经过各种处理后,最终会以WriteLinesToFile结束。除非遇到重复的行,否则它可以正常工作)

1 个答案:

答案 0 :(得分:3)

Msbuild任务批处理不循环。它完成它应该做的事情,将具有相同元数据值的批量分组。在您的示例中,它按%(标识)进行分组。

项目转换是否适用于您的情况?像

这样的东西

<Message Importance="High" Text="@(MyMessage->'someprefix;%(Identity);somesuffix')"/>