Могу ли я добавить условные определения в командной строке msbuild? - PullRequest
11 голосов
/ 14 декабря 2011

У меня есть следующий пример кода:

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"

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

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

Ответы [ 5 ]

19 голосов
/ 14 декабря 2011

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

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

/ property: name = value

Устанавливает или переопределяет эти свойства уровня проекта, где name - это имя свойства, а value - значение свойства.Используйте точку с запятой или запятую для разделения нескольких свойств или укажите каждое свойство отдельно./ р также приемлемо.Например: / 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) в поле Включитьварианты проекта с помощью IDE.И, по крайней мере, это не помешало мне, даже не имея опции, определенной в dproj.Командная строка, создаваемая из этой среды, была:

...rad studio\7.0\bin\dcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....

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

5 голосов
/ 24 июня 2016

Почти 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

2 голосов
/ 14 декабря 2011

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

1 голос
/ 20 июля 2016

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

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

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

1 голос
/ 24 сентября 2015

Другой способ - создать файл проекта оболочки, подобный этому:

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

...