0

互いに重複しているいくつかの項目を含む ItemGroup があります。ItemGroup 内のすべてのアイテムの変更されたバージョンでタスクを実行したいと考えています。しかし、これまでのところ、重複したアイテムを削除しない方法を見つけることができませんでした.

そのようなものは存在しますか?

<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 の出力にすべての項目が含まれていますが、項目の連結値に対して Message タスクが 1 回しか実行されていません。だから、これは私が望んでいるものではありません。

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

2番目のバージョンでは、必要に応じてメッセージタスクを数回実行していますが、重複を削除しています。これはやりたくないことです。

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

私がやりたいことは根本的に不可能ですか (その場合、おそらく私のタスクのために PowerShell に切り替える時が来ました)、それを行うための合理的な方法はありますか?

(私の実際のタスクでは、項目は ReadLinesFromFile から取得され、さまざまな処理の後、最終的には WriteLinesToFile になります。重複した行が発生した場合を除いて、正常に動作します)

4

1 に答える 1

3

msbuild タスクのバッチ処理がループしていません。同じメタデータ値を持つバッチ内のアイテムをグループ化して、想定されていることを実行します。あなたの例では、%(Identity) でグループ化しています。

あなたの場合、アイテム変換は機能しますか? 何かのようなもの

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

于 2013-11-07T13:22:28.053 に答える