WiX Installer:MSIEXEC命令行管理员安装时设置组件条件属性
解决方案:利用管理员安装提取对应版本文件
首先结合你现有的WiX/MSI机制拆解问题:
你当前是通过**预处理器变量$(var.FLAVOUR)**在编译阶段就完成了版本组件的筛选——每个版本(50/200/LITE)都会编译出独立的MSI包,包里只包含对应版本的组件(其他版本组件的Condition在编译后会变成恒假表达式,不会被纳入最终的MSI)。这种编译时分离版本的方式非常稳定,完全可以和管理员安装(msiexec /a)配合生成对应版本的Zip包。
步骤1:确保已有分版本的MSI包
先确认你已经为每个FLAVOUR编译好对应的MSI:
- 编译
FLAVOUR=50生成OurProduct_50.msi - 编译
FLAVOUR=200生成OurProduct_200.msi - 编译
FLAVOUR=LITE生成OurProduct_LITE.msi
这一步你应该已经在日常执行了,毕竟现有机制运行多年,只是现在要把这些MSI用来做文件提取。
步骤2:针对每个MSI执行管理员安装命令
管理员安装的核心作用就是把MSI中包含的所有文件提取到指定目录,并且保留原有的目录结构,完美匹配你生成Zip包的需求。
针对每个版本执行以下命令(以200版本为例):
msiexec /a OurProduct_200.msi TARGETDIR=C:\Extracted\Product_200 /qn
参数解释:
/a:指定管理员安装模式(这是提取文件的关键,不会真正安装到系统)TARGETDIR:设置文件提取的目标目录,你可以根据版本设置不同的路径/qn:静默执行,不需要用户交互,适合自动化脚本
执行完成后,C:\Extracted\Product_200目录下就会有200版本的所有文件和完整目录结构,直接把这个目录打包成Zip即可。
可选:单MSI多版本提取(不推荐修改现有稳定机制)
如果你想尝试用同一个MSI包,通过运行时参数控制提取哪个版本的文件,需要修改WiX代码把组件条件从预处理器变量改成安装时属性:
<Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*"> <File Id="fil238A776D9294E14671E012472F9F7196" KeyPath="yes" Source="$(var.MenusPath)\ClientListView 200.r5m" /> <Condition>FLAVOUR="200"</Condition> </Component> <Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*"> <File Id="fil808D6428D67248DDB8CA65DBC5978283" KeyPath="yes" Source="$(var.MenusPath)\ClientListView Lite.r5m" /> <Condition>FLAVOUR="LITE"</Condition> </Component>
编译时不再传入FLAVOUR预处理器变量,让所有组件都包含到同一个MSI里。之后提取时通过命令行传递FLAVOUR属性:
msiexec /a OurProduct.msi TARGETDIR=C:\Extracted\Product_LITE FLAVOUR=LITE /qn
不过要注意:这种方式需要修改你运行多年的稳定机制,会带来额外的测试和维护成本,除非有特殊需求,否则更推荐沿用你现有的分版本MSI方案。
内容的提问来源于stack exchange,提问作者Big Chris
相关产品推荐
相关产品推荐

