我可以在msbuild命令行中添加条件定义吗?

Dav*_*nan 13 delphi msbuild delphi-xe2

我有以下示例代码:

program boohoo;

{$APPTYPE CONSOLE}

{$IFDEF boo}
{$MESSAGE warn 'boo'}
{$ENDIF}

{$IFDEF hoo}
{$MESSAGE warn 'hoo'}
{$ENDIF}

begin
end.
Run Code Online (Sandbox Code Playgroud)

在项目选项boo中定义条件.我希望能够添加条件hoo作为我的msbuild命令行的一部分.

我试过这样的:

msbuild boohoo.dproj /p:Config=Release;DCC_Define="$(DCC_Define);hoo"
Run Code Online (Sandbox Code Playgroud)

输出显示hoo但不是boo.当我使用详细输出来查看dcc32命令时,我看到了

-D$;hoo
Run Code Online (Sandbox Code Playgroud)

显然,我可以这样做:

msbuild boohoo.dproj /p:Config=Release;DCC_Define="boo;hoo"
Run Code Online (Sandbox Code Playgroud)

但自然我想使用项目选项中声明的条件以及我在命令行中指定的条件.

有没有办法让我参考底层配置的值来指定这个属性?

Mar*_*ema 20

免责声明:不要自己使用MsBuild,全部取自文档和一些IDE实验

根据MsBuild命令行参考(http://msdn.microsoft.com/en-us/library/ms164311.aspx):

/属性:名称=值

设置或覆盖这些项目级属性,其中name是属性名称,value是属性值.使用分号或逗号分隔多个属性,或单独指定每个属性./ p也可以接受.例如:/ property:WarningLevel = 2; OutputDir = bin\Debug

设置或覆盖是您可以为属性值做的所有事情.无法从项目文件添加属性值或隐藏功能的情况.

但我想你可以做的是在你的dproj文件中定义一个自定义属性,默认值为"":

<PropertyGroup>
  <ExtraDefines> </ExtraDefines>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

在你的define语句中引用它

<DCC_Define>DUNIT;$(ExtraDefines);$(DCC_Define)</DCC_Define>
Run Code Online (Sandbox Code Playgroud)

这应该在IDE中 DUNIT;$(ExtraDefines)

然后在命令行上指定它:

msbuild boohoo.dproj /p:Config=Release;ExtraDefines="hoo"
Run Code Online (Sandbox Code Playgroud)

我测试了使用IDE将$(ExtraDefines)添加到项目的Include选项中.即使没有在dproj中定义的选项,至少那个也没有对我说话.IDE生成的命令行是:

...rad studio\7.0\bin\dcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....
Run Code Online (Sandbox Code Playgroud)

这似乎表明$(ExtraDefines)因为没有价值而被淘汰.并且它应该使用MSBuild获取并在命令行上指定一个值.

  • 精彩.这非常有效.非常优秀的思考,非常感谢你. (4认同)
  • 很高兴我能帮助你 :) (2认同)

小智 5

差不多5年后,但所有答案都不太优雅))

最近,我遇到了同样的问题

这是解决方案:

通常,DCC_Define在.dproj文件中定义,如下所示:

<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <DCC_Define>boo;$(DCC_Define)</DCC_Define>
Run Code Online (Sandbox Code Playgroud)

我们都尝试过定义DCC_Define /property:DCC_Define=blah-blah

但相应如何:使用不同的选项构建相同的源文件:

在命令行中指定的属性值优先于在项目文件中为同一属性设置的任何值,并且项目文件中的值优先于环境变量中的值.

所以,失败(这是问题!)

但!如何:在构建中使用环境变量

在MSBuild项目中使用环境变量

  • 以与项目文件中声明的变量相同的方式引用环境变量.例如,以下代码引用BIN_PATH环境变量:

    <FinalOutput>$(BIN_PATH)\MyAssembly.dll</FinalOutput>
    
    Run Code Online (Sandbox Code Playgroud)

因此,我们必须使用DCC_DefineADDITIONAL条件的名称和值来定义环境变量

> set DCC_Define=hoo;doo;moo;foo
Run Code Online (Sandbox Code Playgroud)

然后简单地运行

> msbuild boohoo.dproj /p:Config=Release
Run Code Online (Sandbox Code Playgroud)

那时DCC32就会到来 -Dboo;hoo;doo;moo;foo