在Wix中设置组件的条件

时间:2013-03-04 11:33:38

标签: wix installer windows-installer

在我的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构建软件包时才选择不安装这些组件...

这是正常行为吗?

3 个答案:

答案 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 ,因此只有它们出现在输出包中。如果你有一些始终存在的组件,但这只是少数可选的。