在我的Wix中,我以这种方式包含了很多文件:
<Component Id="mycomponent" Guid="*" Feature="Core" >
<Condition>$(var.Include) = 1</Condition>
<File Id="mycomponent.file" KeyPath="yes"
Source="$(var.BinDir)\mycomponent.file" />
</Component>
所以我可以传入一个不同的var.Include值来为不同的环境生成包。
虽然生成的包看起来确实有效,但是我注意到即使我将它设置为不包含这些组件,包的大小也总是很大。看起来WiX总是包含构建msi的所有组件,并且只有在使用var.Include = 0构建软件包时才选择不安装这些组件...
这是正常行为吗?
答案 0 :(得分:6)
condition元素用于确定组件是否已安装,而不是它是否包含在构建中。另外,请确保不要混淆条件语句和预处理程序变量/语句中使用的Windows Installer属性。两种不同的野兽。
答案 1 :(得分:5)
您可以使用某些文件压缩/解压缩软件(如7zip)打开MSI输出文件进行确认,然后打开打开的MSI文件中的package.cab文件。并检查你的文件是否与“mycomponent”一样存在。
我希望它是预期的,因为它依赖于变量,甚至可以通过install命令调用设置为install属性。
UPDATE:您可以使用预处理程序语句修改WIX,如下所示,它可以从生成的msi中排除这些可选组件
<?if $(env.MySku) = Enterprise ?>
<Component Id="mycomponent" Guid="*" Feature="Core" > <Condition>$(var.Include) = 1>
<File Id="mycomponent.file" KeyPath="yes" Source="$(var.BinDir)\mycomponent.file" />
</Component>
<?endif ?>
答案 2 :(得分:3)
正如@RinoTom和@Christopher指出的那样,安装时选择(条件标记)与构建时选择(?if 元标记)非常不同。要在安装时选择,所包含的组件必须位于 .msi 中。这种方法的优点是,您可以设置确定其条件的属性,不仅在构建时,而且在安装时以及通过对话框或 AppSearch 。
但您要求的是多个包构建,每个包构建都针对在构建时选择的特定条件集。可能适合您的替代方法是将每个可选组件定义为单独文件中的 Fragment 。然后,对于每个包配置,只编译所需的片段:
del /q *.wixobj
candle main_package.wxs
for %%f in (optional_1.wxs optional_5.wxs optional_27.wxs) do candle %%f
light *.wixobj -out tailored_package_A.msi
由于只有您想要包含的片段已编译为 .wixobj ,因此只有它们出现在输出包中。如果你有一些始终存在的组件,但这只是少数可选的。