それが可能だ。手動で結合を実行する必要があります。
これを行う方法の例を次に示します(msbuild 3.5以降が必要です)。
<ItemGroup>
<ServerTypeA Include="ServerA;ServerB;">
<MetaDataA>A</MetaDataA>
</ServerTypeA>
<ServerTypeB Include="ServerB;ServerC;">
<MetaDataB>B</MetaDataB>
</ServerTypeB>
</ItemGroup>
<Target Name="JoinServers" DependsOnTargets="ProcessServerTypeA;ProcessServerTypeB">
<Message Text="%(Joined.Identity) Metadata: %(Joined.MetaDataA)%(Joined.MetaDataB)"/>
</Target>
<!--Create -->
<Target Name="ProcessServerTypeA">
<ItemGroup>
<Joined Include="%(ServerTypeA.Identity)">
<MetaDataA>%(ServerTypeA.MetaDataA)</MetaDataA>
</Joined>
</ItemGroup>
</Target>
<!--Need to batch at the target level for this to work-->
<Target Name="ProcessServerTypeB" Inputs="@(ServerTypeB)" Outputs="%(ServerTypeB.Identity)'">
<PropertyGroup>
<!--Create Temporary Properties for the Item Metadata-->
<TempItemName>%(ServerTypeB.Identity)</TempItemName>
<TempMetaDataB>%(ServerTypeB.MetaDataB)</TempMetaDataB>
<!--Does the current item already exist?-->
<TempIsDuplicate Condition="'%(Joined.Identity)' == '$(TempItemName)'">True</TempIsDuplicate>
</PropertyGroup>
<ItemGroup>
<!--Update the existing item's metadata if this is a duplicate-->
<!--Don't provide the include attribute. This will allow you to update existing items metadata-->
<!--Have to reference %(Joined.Identity) in the condtion to ensure we only update the correct item-->
<!--You cannot directly reference metadata from ServerTypeB here. Hence the need for the temp Properties-->
<Joined Condition="'%(Joined.Identity)' == '$(TempItemName)'">
<MetaDataB>$(TempMetaDataB)</MetaDataB>
</Joined>
<!--Create a new item if current item is not a duplicate-->
<Joined Include="$(TempItemName)" Condition="'$(TempIsDuplicate)' != 'True'">
<MetaDataB>$(TempMetaDataB)</MetaDataB>
</Joined>
</ItemGroup>
</Target>
ターゲットを実行するJoinServers
と、次の出力が生成されます。
ServerA Metadata: A
ServerB Metadata: AB
ServerC Metadata: B
より良い答えで更新する
この質問は、私にはるかに簡単な解決策を示しました。
基本的に、とを使用して変換修飾子を使用%(Identity)
して結合を実行します。
上記の3つのターゲットすべてを次のターゲットに置き換えて、同じ出力を取得できます。
<Target Name="JoinServers">
<ItemGroup>
<Joined Include="%(Identity)">
<MetaDataA>@(ServerTypeA->'%(MetaDataA)')</MetaDataA>
<MetaDataB>@(ServerTypeB->'%(MetaDataB)')</MetaDataB>
</Joined>
</ItemGroup>
<Message Text="%(Joined.Identity) Metadata: %(Joined.MetaDataA)%(Joined.MetaDataB)"/>
</Target>