我有以下示例代码:
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"
但我自然希望在项目选项 plus 中使用在命令行中指定的任何条件。
有没有办法让我参考底层配置的值来指定这个属性?
答案 0 :(得分:19)
免责声明:不要自己使用MsBuild,全部来自文档和一些IDE实验
根据MsBuild命令行参考(http://msdn.microsoft.com/en-us/library/ms164311.aspx):
/属性:名称=值
设置或覆盖这些项目级属性,其中name是 属性名称和值是属性值。使用分号或 逗号分隔多个属性,或指定每个属性 分别。 / p也可以接受。例如: /属性:WarningLevel = 2; OutputDir = BIN \调试
设置或覆盖是您可以为属性值执行的所有操作。无法从项目文件添加属性值或隐藏功能的情况。
但我想你可以做的是在你的dproj文件中定义一个自定义属性,默认值为“”:
<PropertyGroup>
<ExtraDefines> </ExtraDefines>
</PropertyGroup>
在你的定义声明
中引用它<DCC_Define>DUNIT;$(ExtraDefines);$(DCC_Define)</DCC_Define>
在IDE中应该是DUNIT;$(ExtraDefines)
然后在命令行中指定它:
msbuild boohoo.dproj /p:Config=Release;ExtraDefines="hoo"
我测试了使用IDE将$(ExtraDefines)添加到项目的Include选项中。即使没有在dproj中定义的选项,至少那个没有对我说。 IDE从中生成的命令行是:
...rad studio\7.0\bin\dcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....
这似乎表明$(ExtraDefines)因为没有价值而被淘汰。并且它应该使用MSBuild获取并在命令行上指定一个值。
答案 1 :(得分:5)
差不多5年后,但所有答案都不太优雅))
最近,我遇到了同样的问题
这是解决方案:
通常,DCC_Define在.dproj文件中定义,如下所示:
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>boo;$(DCC_Define)</DCC_Define>
我们都尝试通过/property:DCC_Define=blah-blah
但相应于How to: Build the Same Source Files with Different Options:
在命令行中指定的属性值优先于在项目文件中为同一属性设置的任何值,并且项目文件中的值优先于环境变量中的值。
所以,失败(这是问题!)
BUT! How to: Use Environment Variables in a Build
在MSBuild项目中使用环境变量
以与项目文件中声明的变量相同的方式引用环境变量。例如,以下内容 代码引用BIN_PATH环境变量:
<FinalOutput>$(BIN_PATH)\MyAssembly.dll</FinalOutput>
因此,我们必须定义名为DCC_Define
的环境变量和我们的ADDITIONAL条件的值
> set DCC_Define=hoo;doo;moo;foo
然后只需运行
> msbuild boohoo.dproj /p:Config=Release
然后DCC32将获得-Dboo;hoo;doo;moo;foo
答案 2 :(得分:2)
简单明了的解决方案是创建一个新的构建配置(比如boohooRelease
),将boo
和hoo
条件定义添加到其中并编译为msbuild boohoo.dproj /p:Config=boohooRelease
。不完全是你想要做的,但它确实有效。
答案 3 :(得分: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文件。
答案 4 :(得分:1)
我刚试过以下内容并且有效,所以不知道微软是否改变了它:
r
记得添加双引号“”,否则无效