msbuild中的双循环?

Sas*_*cha 13 msbuild nested batch-file

我正在为msbuild编写一个脚本,它应该一步完成两个批处理.
示例:2个ItemGroups

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

<ItemGroup>
 <GroupTwo Include="A" />
 <GroupTwo Include="B" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

这两组应该相互循环:

<Message Text="%(GroupOne.Identity) %(GroupTwo.Identity)" />
Run Code Online (Sandbox Code Playgroud)

我希望msbuild能够完成两个批次的结果

1 A  
2 A  
1 B  
2 B  
Run Code Online (Sandbox Code Playgroud)

结果.
但那并没有发生.相反,它返回了以下无用的废话:

1  
2  
  A  
  B  
Run Code Online (Sandbox Code Playgroud)

按照以下链接中的博客(使用本地属性组)的方式进行操作

<PropertyGroup>
  <GroupOneStep>%(GroupOne.Identity)</GroupOneStep>
</PropertyGroup>
<Message Text="$(GroupOneStep) %(GroupTwo.Identity)" />
Run Code Online (Sandbox Code Playgroud)

品牌

2 A   
2 B
Run Code Online (Sandbox Code Playgroud)

任何提示?我疯了.:-(

PS:这里有一个关于该主题的博文-不幸的是因为propsed有它不工作: http://blogs.msdn.com/b/giuliov/archive/2010/04/30/gotcha-msbuild-nested-loops-double -batching.aspx

Dog*_*ars 13

这是一个更简单的解决方案.

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

    <Message Text="%(Combined.Identity) %(Combined.GroupTwo) " />
</Target>
Run Code Online (Sandbox Code Playgroud)

使用中间项组Combined创建Message任务批处理的中间项组.

如果在同一任务中引用两个Item组,Msbuild将分别对它们进行批处理.这不是你想要的

如果你有更多的ItemMetaData,你需要为第二个ItemGroup显式处理它,参考符号@包含的ItemGroup自动包含ItemMetaData,所以你只需要通过显式引用从第二组创建额外的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>
Run Code Online (Sandbox Code Playgroud)


Bri*_*ker 12

尝试使用组1中的标识创建新的ItemGroup,并从组2的标识(或任何其他元数据)中将元数据分配给新项目组.然后使用批处理迭代新组.

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

<Message Text="%(_Group_Merged.Identity)-%(_Group_Merged.Option1)" />
Run Code Online (Sandbox Code Playgroud)

如果您有两个以上的组,则可以添加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)" />
Run Code Online (Sandbox Code Playgroud)