0

2 つの 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各アイテムをCompileIF AND ONLY IF AND ONLY IF AND ONLY IF AND AREADY in に追加する必要がありますCompile

それを行う簡単な方法はありますか?

私の最初の試みは次のようなものです:

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

しかし、それは明らかな理由で機能しません。MSBuild で手動のアンチ結合を行いたくありません。

おそらく使用Excludeするとうまくいくでしょうか?

4

1 に答える 1

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れます。

于 2012-09-16T21:22:34.747 に答える