3

在我的 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 值来为不同的环境生成包。

While the resulting packages do seem to work, however I noticed the size of the packages are always quite big even when I set it to not include these components. It looks as if WiX is always including all components in building the msi, and only chose to not install these components when the package was build with var.Include = 0...

Is this a normal behavior?

4

3 回答 3

6

条件元素用于确定组件是否被安装,而不是它是否包含在构建中。还要确保不要混淆条件语句和预处理器变量/语句中使用的 Windows Installer 属性。两种不同的野兽。

于 2013-03-04T14:41:40.723 回答
5

您可以通过使用一些文件压缩/解压缩软件(例如 7zip)打开您的 MSI 输出文件来确认,然后在打开的 MSI 文件中打开 package.cab 文件。并检查您的 ID 为“mycomponent”的文件是否存在。

我希望它是预期的,因为它依赖于变量,甚至可以从安装命令调用中设置为安装属性。

更新:您可以使用预处理器语句修改 WIX,如下所示,因此它可以从生成的 msi 中排除这些可选组件

    <?if $(env.MySku) = Enterprise ?>
       <Component Id="mycomponent" Guid="*" Feature="Core">
          <Condition>$(var.Include) = 1</Condition>
          <File Id="mycomponent.file" KeyPath="yes" Source="$(var.BinDir)\mycomponent.file" />      
       </Component>
    <?endif ?>
于 2013-03-04T12:17:21.990 回答
3

正如@RinoTom 和@Christopher 指出的那样,安装时选择(Condition标签)与构建时选择( ?if元标签)非常不同。要在安装时选择,包含的组件必须.msi中。这种方法的优点是您可以设置确定其条件的属性,不仅在构建时,而且在安装时也可以通过对话框或AppSearch设置。

但是您需要的是多个包构建,每个包都针对一组特定的条件量身定制,在构建时选择。可能对您有用的替代方法是将每个可选组件定义为单独文件中的片段。然后对于每个包配置,只编译你想要的片段:

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,因此只有它们出现在输出包中。如果您有一些始终存在的组件,但只有少数是可选的,则这种扩展效果特别好。

于 2013-03-05T03:15:02.817 回答