2012-09-16 201 views
0

合并两个ItemGroups我有两个ItemGroups:我怎样才能的MSBuild

<ItemGroup> 
    <Compile Include="A.cs" /> 
    <Compile Include="B.cs" /> 
    <Compile Include="C.cs" /> 
</ItemGroup> 
<ItemGroup> 
    <PEG Include="A.cs" /> 
    <PEG Include="Y.cs" /> 
    <PEG Include="Z.cs" /> 
</ItemGroup> 

我需要PEG做添加每个项目到Compile当且仅当该项目不AREADY在Compile

有没有简单的方法来做到这一点?

我第一次尝试是这样的:

<ItemGroup> 
    <Compile Include="%(PEG.Identity)" Condition=" '$(Compile)' != '%(PEG.Identity)' " /> 
</ItemGroup> 

但是,这并不明显的原因工作。我真的不想在MSBuild中进行手动反连接。

也许使用Exclude会工作吗?

回答

2

好吧,我想通了。

我做错的第一件事就是使用$(Compile)而不是@(Compile)

接下来,我在Exclude属性的正确轨道上。

以下是我想出了:

<?xml version="1.0" encoding="utf-8" ?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Compile"> 
    <ItemGroup> 
    <Compile Include="A.cs" /> 
    <Compile Include="B.cs" /> 
    <Compile Include="C.cs" /> 
    </ItemGroup> 
    <Target Name="Compile"> 
    <ItemGroup> 
     <PEG Include="A" /> 
     <PEG Include="D" /> 
    </ItemGroup> 
    <Message Text="Compile = @(Compile)" /> 
    <Message Text="PEG  = @(PEG)" /> 
    <ItemGroup> 
     <Compile Include="%(PEG.Identity).cs" Exclude="@(Compile)" /> 
    </ItemGroup> 
    <Message Text="Compile = @(Compile)" /> 
    </Target> 
</Project> 

完成上述操作后,Compile包含A.cs;B.cs;C.cs;D.cs达到目标。