Пакетирование MSBuild работает не так, как я ожидал.Как я могу это исправить? - PullRequest
0 голосов
/ 02 февраля 2012

Пакетирование 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.

Как я могу изменить скрипт, чтобы получить поведение, которое я хочу? Я бы предпочел решение, которое не предусматривает жесткого кодирования значений «платформа» в области цели / задачи.

1 Ответ

2 голосов
/ 03 февраля 2012

Вот оно.Вам нужно разбить выходные файлы с каждым Platform.Identity.Я проверял, и это делает то, что вы хотели:

<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>
...