当前位置:  开发笔记 > 编程语言 > 正文

使用MSBuild将多个值传递给Wix DefineConstants属性

如何解决《使用MSBuild将多个值传递给WixDefineConstants属性》经验,为你挑选了2个好方法。



1> Jeff Winn..:

问题:

MSBuild任务(不是MSBuild.exe,名为MSBuild的MSBuild任务)无法处理WIX项目使用的多个常量.通常,您可以在构建脚本中指定属性,如:


但是,在查看构建日志时,您看到的是MSBuild将常量分开,并且不会像您期望的那样将值组合在一起 - 类似于:

Task "MSBuild" Global Properties:
Configuration=MyConfig
Platform=x86
DefineConstants="SOMETHING=1
SOMETHINGELSE=2"

因此,当candle尝试使用这些常量时,它通常会响应"错误CNDL0150:未定义的预处理器变量'$(var.SOMETHINGELSE)'.这意味着MSBuild任务无法正确处理值中包含多个'='的属性当在引号内分组时.如果没有将属性值分组在引号中,它们显然应被视为单独的属性,而不是单个值.

解决方法:

为了解决此问题,您需要直接调用MSBuild.exe并手动将这些值传递给它.

msbuild.exe /p:Configuration=MyConfig /p:Platform=x86 /p:DefineConstants="SOMETHING=1;SOMETHINGELSE=2" YourSolution.sln

这将使您的常量按照您希望的方式工作,而无需重新设计您的WiX安装项目.

注意:如果您只使用一个常量,您仍然可以像这样使用MSBuild任务:



有这样使用MSBuild任务,而不是调用exe文件的方式:http://stackoverflow.com/questions/506687/defining-multiple-values-in-defineconstants-in-msbuild-element/4280454#4280454

2> Rory MacLeod..:

问题在于将名称 - 值对传递给MSBuild任务,然后使MSBuild正确解析它们,以便将它们传递给Candle任务.似乎MSBuild可以处理简单名称列表或单个名称 - 值对,但不能处理对列表.

我的解决方案是在传递到MSBuild任务时转义列表,并在转到Candle任务时再次取消它.

在MSBuild文件中,在属性中定义对,如下所示:


    
        One=1;
        Two=2;
        Three=3;
    

当您调用MSBuild任务时,请转义该属性(需要MSBuild 4):


unescaping必须在wixproj文件中完成,但不需要手动编辑文件.只需打开项目的属性,转到Build选项卡,并在其中显示"Define preprocessor variables",放置:

$([MSBuild]::Unescape($(WixValues)))

即使该框中已有其他变量,这也有效; 只需将其与分号一起添加到列表中即可.

您将在MSBuild日志中看到该candle.exe工具正确接收参数:

candle.exe -dOne=1 -dTwo=2 -dThree=3 -dConfiguration=Release...

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有