Я не могу построить несколько конфигураций проекта одновременно в Visual Studio, но я могу с MSBuild - PullRequest
1 голос
/ 03 февраля 2012

Я хочу создать две конфигурации одновременно для проекта. Скажем так, когда я хочу собрать версию выпуска, но хочу собрать даже отладочную версию (обратное неверно).

Начиная с Использовать одно решение Visual Studio для одновременной сборки x86 и x64? Я пытался добавить в .csproj:

<Target Name="AfterBuild">
    <MSBuild Condition=" '$(Configuration)' == 'Release' " Projects="$(MSBuildProjectFile)" Properties="Configuration=Debug" RunEachTargetSeparately="true" />
</Target>

А если я попытаюсь собрать проект через MSBuild,

MSBuild ConsoleApplication64.csproj /p:Configuration=Release /p:Platform=x86

работает правильно. Две конфигурации построены правильно, и все хорошо.

Проблема заключается в том, что если я пытаюсь собрать его с помощью Visual Studio: выпускная версия создается правильно, а затем начинается сборка отладочной версии, и это дает мне:

Копирование файла из «obj \ x86 \ Debug \ ConsoleApplication64.exe» в «bin \ Debug \ ConsoleApplication64». c: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets (2868,9): ошибка MSB3021: невозможно скопировать файл "obj \ x86 \ Debug \ ConsoleApplication64.exe" в "bin \ Debug \" ConsoleApplication64.exe». Не удалось найти файл 'obj \ x86 \ Debug \ ConsoleApplication64.exe'.

Предварительные условия:

  • Windows XP SP3 ITA
  • Visual Studio 2010 SP1 Английский
  • Проект представляет собой пустое консольное приложение для C # 4.0 (технически это не так, но я могу воспроизвести проблему с этим).

(Обратите внимание, что для получения этих сообщений я активировал многословие: обычное в меню Инструменты Параметры Проекты и решения Сборка и запустите Детализация вывода сборки проекта MSBuild .

После сравнения выходных данных двух «половинных» прогонов разница в том, что в «рабочей» половине вызывается исполняемый файл csc, а в другой - нет:

Выпускная половина:

Задача "Csc" (TaskId: 13) c: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe / noconfig / nowarn: 1701,1702 / nostdlib + / платформа: x86 / errorreport: приглашение / предупреждение: 4 / определить: TRACE / ссылка: "C: \ Programmi \ Ссылка Сборки \ Microsoft \ Framework.NETFramework \ v4.0 \ Профиль \ Client \ Microsoft.CSharp.dll» / Ссылка: "C: \ Programmi \ Reference Сборки \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ mscorlib.dll» / Ссылка: "C: \ Programmi \ Reference Сборки \ Microsoft \ Framework.NETFramework \ v4.0 \ Профиль \ Client \ System.Core.dll» / Ссылка: "C: \ Programmi \ Reference Сборки \ Microsoft \ Framework.NETFramework \ v4.0 \ Профиль \ Client \ System.dll» / debug: pdbonly / filealign: 512 / optimize + /out:obj\x86\Release\ConsoleApplication64.exe / target: exe Program.cs Свойства \ AssemblyInfo.cs "C: \ Documents and Настройки \ m.alberti минусы \ Impostazioni Весь местный \ Temp.NETFramework, Version = v4.0, профиль = Client.AssemblyAttributes.cs» (TaskId: 13) Завершено выполнение задачи "Csc". (TaskId: 13) * 1 049 *

Отладочная половина:

Задача "Csc" (TaskId: 41) Выполнено выполнение задания "Csc". (TaskId: 41)

После еще нескольких тестов я заметил, что если две половины используют один и тот же DefineConstants, то нет никаких проблем, и все работает, но если они отличаются (как в release / debug), то это не так Работа. : - (

1 Ответ

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

Невозможно выполнить сборку в Visual Studio из-за механизма инкрементной сборки MSBuild, который пропускает цели, помеченные как уже выполненные. Реальный вопрос здесь состоит в том, как сломать эту инкрементную сборку. Этот вопрос очень связан.

Если вы строите с /verbosity=diag, вы заметите, что MSBuild сообщает о таких:

Цель "AssignTargetPaths" пропущена. Ранее построен успешно.

Microsoft знает об этом и считает это намеренно .

Возможный обходной путь, который я настоятельно рекомендую, - вызвать вторую сборку с помощью задачи Exec . Задача Exec - это просто оболочка командной строки, которая будет съедать все, чем вы будете ее кормить, но в вашем случае она может нарушить цепочку инкрементной сборки.

<Exec Command="$(MSBuildToolsPath)\msbuild $(MSBuildProjectFile) /p:Configuration=Debug" Condition=" '$(Configuration)' == 'Release'" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...