Можно ли добавить условные определения в командной строке msbuild?
У меня есть следующий пример кода:
program boohoo;
{$APPTYPE CONSOLE}
{$IFDEF boo}
{$MESSAGE warn 'boo'}
{$ENDIF}
{$IFDEF hoo}
{$MESSAGE warn 'hoo'}
{$ENDIF}
begin
end.
В параметрах проекта определен условный boo
. Я хотел бы иметь возможность добавить условный hoo
как часть моей командной строки msbuild.
Я пробовал это следующим образом:
msbuild boohoo.dproj /p:Config=Release;DCC_Define="$(DCC_Define);hoo"
На выходе отображается hoo
, но не boo
. Когда я использую подробный вывод для просмотра команды dcc32, я вижу
-D$;hoo
Ясно, что я могу сделать это следующим образом:
msbuild boohoo.dproj /p:Config=Release;DCC_Define="boo;hoo"
но, естественно, я хочу использовать любые условные выражения в параметрах проекта плюс то, что я указываю в командной строке.
Есть ли способ указать это свойство со ссылкой на значение из базовой конфигурации?
Ответы
Ответ 1
Отказ от ответственности: еще не используйте MsBuild, все взятые из документов и некоторых экспериментов IDE
В соответствии с ссылкой командной строки MsBuild (http://msdn.microsoft.com/en-us/library/ms164311.aspx):
/свойство: имя = значение
Устанавливает или переопределяет эти свойства на уровне проекта, где имя имя свойства и значение - это значение свойства. Используйте точку с запятой или запятой, чтобы отделить несколько свойств или указать каждое свойство в отдельности. /p также приемлемо. Например: /Свойство: WarningLevel = 2; OutputDir = Bin\Debug
настройка или переопределение - это все, что вы можете сделать для значения свойства. Добавление к значению свойства из файла проекта либо невозможно, либо случай скрытой функции.
Но я предполагаю, что вы можете сделать это, чтобы определить настраиваемое свойство в вашем файле dproj с "по умолчанию":
<PropertyGroup>
<ExtraDefines> </ExtraDefines>
</PropertyGroup>
ссылается на инструкцию
<DCC_Define>DUNIT;$(ExtraDefines);$(DCC_Define)</DCC_Define>
который в IDE должен быть DUNIT;$(ExtraDefines)
а затем укажите его в командной строке:
msbuild boohoo.dproj /p:Config=Release;ExtraDefines="hoo"
Я тестировал добавление $(ExtraDefines) к параметрам Include для проекта с использованием IDE. И, по крайней мере, это не задело меня, даже не имея опцию, определенную в dproj. Командная строка IDE, полученная от этого, была:
...rad studio\7.0\bin\dcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....
Который, кажется, указывает, что $(ExtraDefines) был ликвидирован, поскольку он не имел никакой ценности. И что его нужно взять с помощью MSBuild и указать значение в командной строке.
Ответ 2
Почти 5 лет спустя, но все ответы не совсем элегантны))
Недавно я столкнулся с той же проблемой
И вот решение:
Обычно DCC_Define определяется в файле .dproj следующим образом:
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>boo;$(DCC_Define)</DCC_Define>
Мы все пытались определить DCC_Define через /property:DCC_Define=blah-blah
Но в соответствии с Как создать одинаковые исходные файлы с различными параметрами:
Значение свойства, указанное в командной строке, имеет приоритет над любым значением, установленным для того же свойства в файле проекта, и это значение в файле проекта имеет приоритет над значением в переменной среды.
Итак, сбой (вот вопрос здесь!)
НО! Практическое руководство. Использование переменных среды в сборке
Чтобы использовать переменную среды в проекте MSBuild
-
Ссылка на переменную среды так же, как вы указали бы переменную в файле проекта. Например, следующее код ссылается на переменную среды BIN_PATH:
<FinalOutput>$(BIN_PATH)\MyAssembly.dll</FinalOutput>
Итак, мы должны определить переменную среды с именем DCC_Define
и значениями наших ДОПОЛНИТЕЛЬНЫХ условных обозначений
> set DCC_Define=hoo;doo;moo;foo
а затем просто запустите
> msbuild boohoo.dproj /p:Config=Release
DCC32 получит -Dboo;hoo;doo;moo;foo
Ответ 3
Простым решением является создание новой конфигурации сборки (скажем, boohooRelease
), добавьте к ней условные обозначения boo
и hoo
и скомпилируйте как msbuild boohoo.dproj /p:Config=boohooRelease
. Не совсем то, что вы пытаетесь сделать, но оно работает.
Ответ 4
Другой способ - создать файл проекта-обертки следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Full" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Full">
<CreateProperty Value="$(DCC_Define);$(ExtraDefines)">
<Output TaskParameter="Value" PropertyName="DCC_Define"/>
</CreateProperty>
</Target>
<Import Project="example.dproj" />
</Project>
и вызывается следующим образом:
msbuild.exe "/t:Clean;Full;Build" "/p:config=Debug" /p:ExtraDefines=SOME_DEFINE wrapper.proj
Это, конечно, менее изящно, но вам не нужно изменять файл .dproj.
Ответ 5
Я просто попробовал следующее, и это сработало, поэтому не знаю, изменила ли Microsoft его:
msbuild "myApp.dproj" /t:build /property:DCC_Define="boo"
не забудьте добавить двойную кавычку "", иначе она не будет работать