我们的产品有三种类型/口味,但只有一种用 WiX 编写的 MSI。当我们构建安装程序时,我们通过定义的常量传递风味:
Call MSBUILD.bat ..\MSIs\CoreProduct\OurProduct.sln /p:DefineConstants="FLAVOUR=%_Flavour%"
Run Code Online (Sandbox Code Playgroud)
常量在 Visual Studio 中设置,在 Build -> Define preprocessor variables as FLAVOUR=50 下。构建过程传递值 50、200 或 LITE 作为风味。
在 WiX 代码中,我们在组件上有很多条件,告诉它根据风格安装哪个文件;例如
<Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">
<File Id="fil238A776D9294E14671E012472F9F7196"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView 200.r5m"
<Condition>$(var.FLAVOUR)=200</Condition>
</Component>
<Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">
<File Id="fil808D6428D67248DDB8CA65DBC5978283"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView Lite.r5m"
<Condition>$(var.FLAVOUR)=LITE</Condition>
</Component>
Run Code Online (Sandbox Code Playgroud)
因此,如果 FLAVOR 为 LITE,上面的示例将安装一个名为“ClientListView Lite.r5m”的文件,如果 FLAVOR 为 200,它将安装一个名为“ClientListView 200.r5m”的文件。
这一切都按预期工作,并且已经做了多年!!
但是现在,我们有我们产品的网络版本,我们需要一个 zip 文件来包含将为每种口味安装的文件夹结构和文件。我发现您可以使用 MSIEXEC 和 /a 参数在命令行上运行 msi,然后将所有已安装到文件夹中的内容重定向并认为这正是我想要的......但可惜它不像我那样工作早就料到了。
它似乎正在做的是运行 MSI 并将文件提取到目标文件夹中,但它忽略了风味,因此您最终将“ClientListView Lite.r5m”和“ClientListView 200.r5m”文件都提取到文件夹; 这显然不是我想要的。
在阅读 MSIEXEC 上的文档后,您似乎可以传递公共属性的值,例如 msiexec.exe /a "C:\Example.msi" MY_PROP="myValue" - 所以我认为这可能对我有帮助;所以在我的 …