在链接wixlib时处理孤立的组件

时间:2015-04-08 09:10:42

标签: wix wix3.9 wixlib

我的任务是根据第三方提供的相同wixlib构建2个安装程序。完整安装程序包括所有组件,Lite仅核心内容。我假设wixlib具有以下结构:

<Fragment>
  <ComponentGroup Id="CoreStuff">
    <!-- List of components for this bit, roughly 5MB -->
  </ComponentGroup>
</Fragment>
<Fragment>
  <ComponentGroup Id="ExtraStuff">
    <!-- List of components for this bit, roughly 45MB -->
    <ComponentRef Id="BigFile1"/>
  </ComponentGroup>
  <Component Id="BigFile1">
    <File Id="BigFile1_bin" Name="BigFile1.bin"/>
  </Component>
</Fragment>

安装程序是在msbuild中构建的。组件以下列方式包含在项目中:

<Feature Id="ThirdPartyStuff">
  <ComponentGroupRef Id="CoreStuff"/>
  <?if $(var.Configuration) = "Full"?>
  <ComponentGroupRef Id="ExtraStuff"/>
  <?endif?>
</Feature>

最后,正如预期的那样,我收到了LGHT0267错误:

  

错误LGHT0267:找到了孤立的组件&#39; BigFile1&#39;。如果这是一个产品,则每个组件必须至少有一个父功能。要在模块中包含组件,必须将其直接包含在Module元素的Component元素中,或者通过ComponentRef,ComponentGroup或ComponentGroupRef元素间接包含。

有没有人想出如何有选择地使用wixlib中提供的组件?我可以将ExtraStuff包含为用户的单独功能,但此处的目标是缩小安装程序。我可以礼貌地问ThirdParty提供两个单独的wixlib,但是我想避免它。

2 个答案:

答案 0 :(得分:1)

我不认为wix只能使用wixlib包的一部分。将wixlibs视为合并模块(没有可查看的表)。您不能仅消耗合并模块的一半,并且您只能消耗wixlib的一半。

我担心你不得不要求第三方将他们的wixlib分成两个包。

答案 1 :(得分:1)

经过一番奋斗,我得到了解决方法,讨厌的解决方法:

  1. 像往常一样创建虚拟wixproject并包含wixlib。
  2. 添加虚拟项目作为最终项目的依赖项
  3. 在虚拟项目的后期构建事件中设置要运行的powershell脚本,它将:
    • 使用dark.exe
    • 对带有二进制输出(switch -x)的dummy.msi进行反编译
    • 使用包含标签的dummy.wxs制作new.wxs文件,使组件成为条件
  4. 在最终项目中包含new.wxs