2011-01-24 36 views
11

Tôi đang viết một kịch bản cho msbuild mà nên thực hiện hai lô trong một bước.
Ví dụ: 2 ItemGroupsDouble-Loop trong msbuild?

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

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

Hai nhóm nên được looped trong nhau:

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

Tôi hy vọng rằng msbuild làm cho kết quả lên của cả hai lô cho

1 A 
2 A 
1 B 
2 B 

như kết quả.
Nhưng điều đó không xảy ra. Thay vào đó, nó trả lại tào lao vô ích sau:

1 
2 
    A 
    B 

Làm điều đó một cách blog từ liên kết dưới đây đề xuất (sử dụng một propertygroup địa phương) như

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

làm

2 A 
2 B 

Bất kỳ gợi ý? Tôi sẽ điên. :-(

PS: Đây là một bài đăng trên blog về chủ đề - tiếc là nó không làm việc như propsed có: http://blogs.msdn.com/b/giuliov/archive/2010/04/30/gotcha-msbuild-nested-loops-double-batching.aspx

Trả lời

11

Hãy thử điều này để tạo ra một ItemGroup mới bằng cách sử dụng danh tính từ nhóm 1 và gán siêu dữ liệu cho nhóm mặt hàng mới từ bản sắc (hoặc bất kỳ siêu dữ liệu khác) của nhóm 2. Sau đó sử dụng trạm trộn để lặp qua các nhóm mới.

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

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

Nếu bạn có nhiều hơn hai nhóm bạn có thể thêm mục CreateItem hợp nhất nhóm thứ ba vào _Group_Merged và sau đó lặp qua nhóm kết hợp đó.

<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

Wizard! Điều đó hoạt động! :-) – Sascha

+0

Magic! Cảm ơn bạn –

11

Đây là giải pháp đơn giản hơn nhiều.

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

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

Sử dụng nhóm hạng mục trung gian Combined để tạo nhóm mục trung gian mà tác vụ Tin nhắn được nhóm.

Nếu bạn tham chiếu hai nhóm mục trong cùng một tác vụ, Msbuild sẽ lô trên cả hai cách riêng biệt. đó không phải là những gì bạn muốn

Nếu bạn có thêm ItemMetaData bạn sẽ cần xử lý rõ ràng cho ItemGroup thứ hai, ItemGroup kèm theo biểu tượng tham chiếu @ tự động bao gồm ItemMetaData, vì vậy bạn sẽ chỉ cần tạo MetaData bổ sung từ nhóm thứ hai bằng cách tham chiếu một cách rõ ràng. Dưới đây là ví dụ:

<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

Bạn cũng có thể tạo vòng lặp lồng nhau bằng kỹ thuật 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

Đối với hai vòng lặp lồng nhau làm việc này:

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

Kết quả trong:

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).