2011-01-24 5 views
11

私はmsbuild用のスクリプトを書いています。これは2つのバッチを1つのステップで作成する必要があります。
例:私はMSBuildのがmsbuildのダブルループ?

1 A 
2 A 
1 B 
2 B 

などを与える両方のバッチの最大結果になることが期待

<Message Text="%(GroupOne.Identity) %(GroupTwo.Identity)" /> 

:2 ItemGroups

<ItemGroup> 
<GroupOne Include="1" /> 
<GroupOne Include="2" /> 
</ItemGroup> 

<ItemGroup> 
<GroupTwo Include="A" /> 
<GroupTwo Include="B" /> 
</ItemGroup> 

これら2つのグループは互いに内ループしなければなりません結果。
しかし、それは起こりませんでした。

<PropertyGroup> 
    <GroupOneStep>%(GroupOne.Identity)</GroupOneStep> 
</PropertyGroup> 
<Message Text="$(GroupOneStep) %(GroupTwo.Identity)" /> 

2 A 
2 B 

どれを作る

よう

1 
2 
    A 
    B 

それを(ローカルpropertygroupを使用して)、下のリンクからブログが提案している方法を行う:代わりに、以下の役に立たないがらくたを返さヒント?私は怒っている。 :-(

PS:ここでは、トピックに関するブログ投稿です - そこpropsedとして、残念ながらそれは動作しません: http://blogs.msdn.com/b/giuliov/archive/2010/04/30/gotcha-msbuild-nested-loops-double-batching.aspx

答えて

11

グループ1からのIDを使用してにメタデータを割り当てる新しいItemGroupを作成するには、これを試してみてくださいグループ2のアイデンティティ(または任意の他のメタデータ)から、新しい項目のグループは次に、新しいグループを反復処理するバッチ処理を使用しています。

<CreateItem Include="@(GroupOne)" AdditionalMetadata="Option1=%(GroupTwo.Identity)"> 
    <Output ItemName="_Group_Merged" TaskParameter="Include"/> 
</CreateItem> 

<Message Text="%(_Group_Merged.Identity)-%(_Group_Merged.Option1)" /> 

あなたは以上の2つのグループを持っている場合は、第三のグループをマージするCreateItemエントリを追加することができます_Group_Mergedに挿入し、その結合されたグループを反復処理します。

<CreateItem Include="@(_Group_Merged)" AdditionalMetadata="Option2=%(GroupThree.Identity)"> 
    <Output ItemName="_Group_Merged2" TaskParameter="Include"/> 
</CreateItem> 

<Message Text="%(_Group_Merged2.Identity)-%(_Group_Merged2.Option1)-%(_Group_Merged2.Option2)" /> 
+0

ウィザード!それは動作します! :-) – Sascha

+0

マジック!ありがとうございました –

11

これははるかに簡単な解決策です。そのメッセージタスクバッチに中間項目群を作成する中間項目群Combinedを使用

<Target Name="Default"> 
    <ItemGroup> 
     <Combined Include="@(GroupOne)"> 
      <GroupTwo>%(GroupTwo.Identity)</GroupTwo> 
     </Combined> 
    </ItemGroup> 

    <Message Text="%(Combined.Identity) %(Combined.GroupTwo) " /> 
</Target> 

同じタスクで2つのアイテムグループを参照する場合、Msbuildは を別々にバッチ処理します。あなたはより多くのItemMetaDataを持っている場合は、第二ItemGroupに対して明示的にそれを処理する必要がありますあなたが

何をしたいこれではありません、ItemGroupはあなただけでする必要がありますので、自動的に、ItemMetaDataを含む参照記号@に含まれています明示的に参照して、2番目のグループから追加のMetaDataを作成します。ここでは例です:

<ItemGroup> 
    <GroupOne Include="1"> 
     <Name>One</Name> 
    </GroupOne> 
    <GroupOne Include="2"> 
     <Name>Two</Name> 
    </GroupOne> 
</ItemGroup> 

<ItemGroup> 
    <GroupTwo Include="A"> 
     <Name>Andrew</Name> 
    </GroupTwo> 
    <GroupTwo Include="B"> 
     <Name>Bob</Name> 
    </GroupTwo> 
</ItemGroup> 

<Target Name="Default"> 
    <ItemGroup> 
     <Combined Include="@(GroupOne)"> 
      <GroupTwo>%(GroupTwo.Identity)</GroupTwo> 
      <GroupTwoName>%(GroupTwo.Name)</GroupTwoName> 
     </Combined> 
    </ItemGroup> 

    <Message Text="%(Combined.Identity) %(Combined.Name) %(Combined.GroupTwoName) %(Combined.GroupTwo) " /> 
</Target> 
4

一つもDog Earsの技術を使用してトリプルネストされたループを作ることができます。

<Target Name="Test"> 
    <ItemGroup> 
     <Loop1 Include="L11" /> 
     <Loop1 Include="L12" /> 
     <Loop2 Include="L21" /> 
     <Loop2 Include="L22" /> 
     <Loop3 Include="L31" /> 
     <Loop3 Include="L32" /> 
     <Loop12 Include="@(Loop1)"> 
     <!-- Combine Loop1 and Loop2: Inherit each meta data of Loop1 and add some of Loop2. --> 
     <Loop2Identity>%(Loop2.Identity)</Loop2Identity> 
     </Loop12> 
     <Loop123 Include="@(Loop12)"> 
     <!-- Combine Loop12 and Loop3: Inherit each meta data of Loop12 and add some of Loop3. --> 
     <Loop3Identity>%(Loop3.Identity)</Loop3Identity> 
     </Loop123> 
    </ItemGroup> 
    <!-- Show all entries of Loop1 and Loop2 combined --> 
    <Message Text="Loop12.Identity=%(Loop12.Identity), Loop12.Value1=%(Loop12.Value1), Loop12.Loop2Identity=%(Loop12.Loop2Identity)"/> 
    <!-- Show all entries of Loop1, Loop2 and Loop3 combined --> 
    <Message Text="Loop123.Identity=%(Loop123.Identity), Loop123.Loop2Identity=%(Loop123.Loop2Identity) Loop123.Loop2Identity=%(Loop123.Loop3Identity)"/> 
    </Target> 
0

2つのネストされたループについては、これは動作します:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
     <GroupOne Include="1" /> 
     <GroupOne Include="2" /> 
    </ItemGroup> 

    <ItemGroup> 
     <GroupTwo Include="A" /> 
     <GroupTwo Include="B" /> 
    </ItemGroup> 

    <Target Name="Exec" 
     Outputs="%(GroupOne.Identity)"> 
     <Message Text="Building @(GroupOne->'%(Identity)') %(GroupTwo.Identity)"/> 
    </Target> 

</Project> 

結果に:

Project "D:\tmp\msbuildtest\test.xml" on node 0 (default targets). 
    Building 1 A 
    Building 1 B 
Exec: 
    Building 2 A 
    Building 2 B 
Done Building Project "D:\tmp\msbuildtest\test.xml" (default targets).