Условная компиляция с помощью автоматических сборок в Visual Studio - PullRequest
2 голосов
/ 18 февраля 2009

Вот что я пытаюсь сделать:

  • Один скрипт сборки
  • Этот сценарий создает два исполняемых файла из одного проекта Visual Studio.
  • Первый скомпилированный .exe имеет небольшой код отключен .
  • В другом скомпилированном .exe есть все, что включено .

Я читал об условной компиляции , и это заботится о моих потребностях в том, что касается включения / отключения блоков кода.

Я просто не могу понять, как управлять условной компиляцией из скрипта сборки с помощью msbuild .

Есть ли способ манипулировать переменными условной компиляции из скрипта сборки или каким-либо другим способом выполнить то, что я пытаюсь сделать?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2009

Используйте конфигурации сборки в вашем файле проекта. Установите параметры в PropertyGroup, которая может быть включена в зависимости от конфигурации. Конфигурация может также определить выходной путь для двух разных версий сборки.

Для версии, которой необходимо удалить некоторый код, используйте конфигурацию, которая включает PropertyGroup.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'CompiledOutDebug|AnyCPU' ">
   <DefineConstants>$(DefineConstants);MY_CONDITIONAL_COMPILATION_CONSTANT</DefineConstants>
</PropertyGroup>

Затем используйте сценарий MSBuild, который дважды вызывает сценарий проекта MSBuild и использует атрибут Properties задачи MSBuild, чтобы указать конфигурацию для сборки:

<Target Name="Build">
    <MSBuild Projects="MyProject.csproj;" 
             Targets="Build" 
             Properties="Configuration=Release" />
    <MSBuild Projects="MyProject.csproj"
             Targets="Build"
             Properties="Configuration=CompiledOutDebug" />
  </Target>
1 голос
/ 18 февраля 2009

Если вы не хотите создавать отдельную цель для двух компиляций, вы можете сделать это, указав условное определение в свойстве DefineConstants при повторном вызове сборки:

<Target Name="Build">
    <MSBuild Projects="MyProject.csproj;"
             Targets="Build"
             Properties="Configuration=Debug" />
    <MSBuild Projects="MyProject.csproj"
             Targets="Build"
             Properties="Configuration=Debug;
                         AssemblyName=$(AssemblyName)_Conditional;
                         DefineConstants=$(DefineConstants);CONDITIONAL_DEFINE" />
</Target>

Обратите внимание, что если вы делаете это таким образом, вам также необходимо перезаписать AssemblyName, иначе ваша вторая сборка может выбрать промежуточные файлы из первой сборки.

Вам также следует взглянуть на MSBuild task docs на MSDN, там есть несколько интересных моментов.

1 голос
/ 18 февраля 2009

Хэмиш опередил меня.

Вот альтернативное решение, использующее те же понятия:

В командной строке:

msbuild -t:Clean
msbuild
CopyOutputDirForWithoutDefine.cmd
msbuild -t:Clean
msbuild -property:DefineConstants=MY_CONDITIONAL_COMPILE_CONSTANT
CopyOutputDirForWithDefine.cmd

1-й и 3-й «msbuild -t: Clean» гарантирует, что у вас не осталось остатков от предыдущих сборок. Вторая сборка msbuild строится без условного определения, а четвертая сборка с условным определением.

Если все вышеперечисленное является всего лишь парой предметов для выстрела, то может быть достаточно пакетного файла. Я рекомендую немного изучить MSBuild и на самом деле писать все в файле MSBuild, как это сделал Хэмиш.

...