Можно ли добавить условные определения в командной строке 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"

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

Есть ли способ указать это свойство со ссылкой на значение из базовой конфигурации?

delphi,msbuild,delphi-xe2,

11

Ответов: 5


19 принят

Отказ от ответственности: еще не используйте MsBuild, все взятые из документов и некоторых экспериментов IDE

Согласно ссылке командной строки MsBuild ( http://msdn.microsoft.com/en-us/library/ms164311.aspx ):

/ Свойство: имя = значение

Устанавливает или переопределяет эти свойства уровня проекта, где name - это имя свойства, а значение - значение свойства. Используйте точку с запятой или запятую для разделения нескольких свойств или укажите каждое свойство отдельно. / p также приемлемо. Например: / property: 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 studio7.0indcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....

Который, кажется, указывает, что $ (ExtraDefines) был ликвидирован, поскольку он не имел никакого значения. И что его нужно подобрать с помощью MSBuild и указать значение в командной строке.


Почти 5 лет спустя, но все ответы не совсем изящны))

Недавно я столкнулся с той же проблемой

И вот решение:

Обычно <PropertyGroup Condition = "'$ (Cfg_1)'! = ''" > <DCC_Define> boo; $ (DCC_Define) </ DCC_Define> определяется в файле .dproj следующим образом:

/property:DCC_Define=blah-blah

Мы все пытались определить DCC_Define через <FinalOutput>$(BIN_PATH)MyAssembly.dll</FinalOutput>

Но в соответствии с тем, как: создавать одинаковые исходные файлы с различными параметрами :

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

Итак, провал (вот вопрос!)

НО! Практическое руководство. Использование переменных среды в сборке

Использовать переменную среды в проекте MSBuild

  • Ссылка на переменную среды так же, как вы указали бы переменную в файле проекта. Например, следующий код ссылается на переменную среды BIN_PATH:

    DCC_Define

Итак, мы должны определить переменную среды с именем DCC_Defineи значениями наших ДОПОЛНИТЕЛЬНЫХ условных выражений

> set DCC_Define=hoo;doo;moo;foo

а затем просто запустить

> msbuild boohoo.dproj /p:Config=Release

DCC32 будет тогда -Dboo;hoo;doo;moo;foo


2

Непосредственное решение создать новую конфигурацию сборки (например, boohooRelease), добавьте как booи hooусловные Определяет его и компилировать в msbuild boohoo.dproj /p:Config=boohooRelease. Не совсем то, что вы пытаетесь сделать, но это работает.


1

Другой способ - создать файл проекта-обертки следующим образом:

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


1

Я просто попробовал следующее, и это сработало, поэтому не знаю, изменила ли Microsoft его:

msbuild "myApp.dproj" /t:build /property:DCC_Define="boo"

не забудьте добавить двойную кавычку "", иначе это не сработает

Дельфы, MSBuild, Дельфы-XE2,
Похожие вопросы