关于WiX三种变量创建方式的适用场景咨询
WiX三种变量的适用场景梳理
嘿,我来帮你把这三种WiX变量的适用场景掰扯清楚,毕竟跟WiX打交道这么久,这些场景我可是门儿清:
1. 预处理器变量 (<? define ?> + $(var.))
这种是编译阶段就确定死的静态值,相当于代码里的常量,适用场景包括:
- 重复使用的固定字符串:比如公司名称、项目根路径、固定的版本号前缀,改一处就能同步所有引用的地方,不用到处找着改
- 编译时的配置:比如指定编译用的工具路径、条件编译开关(比如区分debug和release版本的不同配置)
- 引用外部资源的固定路径:比如你要打包的第三方库路径,用预处理器变量定义后,换路径只改一行就行
举个例子,你可以这么用:
<? define CompanyName = "MyCorp" ?> <Product Name="$(var.CompanyName) - MyApp" ...>
2. 本地化字符串变量 (<String> + !(loc.))
你已经知道这个多用于多语言场景,其实它的核心是集中管理所有面向用户的文本,适用场景:
- 多语言安装包:给不同语言做对应的本地化文件,编译时指定不同的loc文件就能生成对应语言的安装包,主WiX源码完全不用动
- 统一维护UI文本:安装界面的按钮文字、提示信息、错误描述都放这里,要改文本风格或者修正错别字,直接改本地化文件,不用去翻一堆WiX源码
- 文本复用:比如安装向导里反复出现的产品名称,用loc变量定义后,改一次所有地方都同步
示例:
<!-- 本地化文件 en-us.wxl --> <String Id="ProductName">My Awesome App</String> <String Id="InstallButtonText">Install Now</String> <!-- 主WiX文件 --> <Control Type="PushButton" Text="!(loc.InstallButtonText)" ...>
3. MSI Property变量 (<Property> + [ ])
这是安装运行时的动态变量,是MSI本身的特性,适用场景和前两种完全不同:
- 需要用户输入或选择的值:比如自定义安装路径(默认的
INSTALLDIR就是个Property)、用户选择的组件组,这些都是安装时才确定的 - 动态计算的值:比如通过自定义动作获取系统的环境变量、检测到的系统版本,然后把结果存到Property里供后续安装步骤使用
- 需要在安装过程中传递的参数:比如从命令行传入的参数(比如
msiexec /i MyApp.msi INSTALLDIR="D:\MyApp"),就是通过Property接收的 - 持久化的配置:如果给Property加上
PERSIST="yes",安装后这个值会留在系统里,后续升级或修复时还能读取到
示例:
<Property Id="CUSTOMINSTALLPATH" Value="C:\Program Files\MyApp" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="CUSTOMINSTALLPATH" Name="MyApp" /> </Directory>
总结一下:
- 编译时固定不变的用预处理器变量
- 面向用户的文本/多语言用本地化变量
- 安装时动态变化、需要交互或传递的用MSI Property变量
内容的提问来源于stack exchange,提问作者Kevin Lee




