MSBuild批处理工作方式与我期望的方式不同。我该如何解决?

时间:2012-02-02 17:03:35

标签: msbuild batching

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 .\test.proj /p:Platform=All执行msbuild,输出如下所示:

...
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项目组中的项目进行分组/过滤。

如何更改脚本以获取我想要的行为?我更喜欢一种不涉及对目标/任务区域中的“平台”值进行硬编码的解决方案。

1 个答案:

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