如何在MSBuild中合并两个ItemGroup

时间:2012-09-16 21:03:20

标签: .net build msbuild compilation

我有两个ItemGroup:

<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 IF,并且仅在Compile中该项目不是AREADY。

有一种简单的方法吗?

我的第一次尝试是这样的:

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

但是,由于显而易见的原因,这并不起作用。我真的不想在MSBuild中进行手动反加入。

也许使用Exclude会有用吗?

1 个答案:

答案 0 :(得分: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