0

MSBuild のバッチ処理が期待どおりに機能していません。「問題」の動作を示す MSBuild スクリプトの簡単な例を次に示します。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <ItemGroup>
    <Platform Condition="('$(Platform)' == 'All') Or ('$(Platform)' == 'x86')" Include="x86" />
    <Platform Condition="('$(Platform)' == 'All') Or ('$(Platform)' == 'x64')" Include="x64" />
  </ItemGroup>
  <Target Name="Build">
    <ItemGroup>
      <OutputFiles Include="%(Platform.Identity)\*.txt"/>
    </ItemGroup>
    <Message Importance="high" Text="%(Platform.Identity): @(OutputFiles)" />
  </Target>
</Project>

このスクリプトに「test.proj」という名前を付け、他のいくつかのサブフォルダー/ファイルと共にフォルダーに配置しました。

.\x86\test-x86.txt
.\x64\test-x64.txt

このように msbuild を実行するmsbuild .\test.proj /p:Platform=Allと、出力は次のようになります。

...
Build:
  x86: x86\test-x86.txt;x64\test-x64.txt
  x64: x86\test-x86.txt;x64\test-x64.txt
...

出力が次のようになることを期待/期待していました。

...
Build:
  x86: x86\test-x86.txt
  x64: x64\test-x64.txt
...

言い換えれば、タスクがOutputFilesどのようにバッチ処理されるかに応じて、項目グループ内の項目をグループ化/フィルター処理する必要があります。Message

スクリプトを変更して、必要な動作を取得するにはどうすればよいですか? ターゲット/タスク領域に「プラットフォーム」値をハードコーディングしないソリューションが望ましいです。

4

1 に答える 1

2

ここにあります。Platform.Identity ごとに OutputFiles を分割する必要があります。私はテストしましたが、これはあなたが望んでいたことをします:

<Project ToolsVersion="3.5" DefaultTargets="Build;" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Platform Condition="('$(Platform)' == 'All') Or ('$(Platform)' == 'x86')" Include="x86"/>
    <Platform Condition="('$(Platform)' == 'All') Or ('$(Platform)' == 'x64')" Include="x64"/>
  </ItemGroup>
  <Target Name="Build">
    <ItemGroup>
      <OutputFiles Include="%(Platform.Identity)\*.txt">
        <Flavor>%(Platform.Identity)</Flavor>
      </OutputFiles>
    </ItemGroup>
    <Message Importance="high" Text="%(OutputFiles.Flavor): %(OutputFiles.Identity)" />
  </Target>
</Project>
于 2012-02-02T22:02:53.277 に答える