WiX:在一个非常大的应用中使用多个CAB

WiX:在一个非常大的应用中使用多个CAB,wix,wix3,Wix,Wix3,我最近开始学习和使用WiX,我的第一个真正的WiX项目是重新打包Qt的自定义配置。这是一个相当大的挑战,因为Qt项目非常庞大 在这个过程中,我成功地打破了我的方式,但最近在链接过程中遇到了障碍。我一直收到Light.exe错误“LGHT0296”,很可能是因为我正在创建一个远远大于2GB的CAB。在尝试了最高的压缩级别后,我唯一的选择就是将安装包拆分为多个CAB文件(旁注:返回的错误非常有助于告诉我应该尝试哪些操作) 无论如何,我发现自己在创建多个CAB文件时有点不知所措。我不完全确定在这种情况

我最近开始学习和使用WiX,我的第一个真正的WiX项目是重新打包Qt的自定义配置。这是一个相当大的挑战,因为Qt项目非常庞大

在这个过程中,我成功地打破了我的方式,但最近在链接过程中遇到了障碍。我一直收到Light.exe错误“LGHT0296”,很可能是因为我正在创建一个远远大于2GB的CAB。在尝试了最高的压缩级别后,我唯一的选择就是将安装包拆分为多个CAB文件(旁注:返回的错误非常有助于告诉我应该尝试哪些操作)

无论如何,我发现自己在创建多个CAB文件时有点不知所措。我不完全确定在这种情况下我应该做什么,而且我还没有找到任何有用的文档或示例来说明如何进行这种拆分。对我来说,做这件事最好的方法是什么


谢谢。

您只需声明多个媒体元素,如下所示:

  <Media Id='1' Cabinet='package1.cab' EmbedCab='no'/> 
  <Media Id='2' Cabinet='package2.cab' EmbedCab='no'/>
  <File Source="./somefile" DiskId="2" />

如果您的安装介质上有足够的空间,并且希望消除安装程序用于解包文件的时间和磁盘空间,那么您也可以将解包文件放在与MSI相关的某个文件夹中,如下所示(您甚至可以通过这种方式创建一个文件夹):


最后,您通过添加一个DiskId属性来选择将每个文件放在哪个介质中,如下所示:

  <Media Id='1' Cabinet='package1.cab' EmbedCab='no'/> 
  <Media Id='2' Cabinet='package2.cab' EmbedCab='no'/>
  <File Source="./somefile" DiskId="2" />


好的,很好。看起来我的思路是对的,我只需要为各个文件分配磁盘ID。唯一的问题是我有超过3万个文件。有没有一个简单的方法可以做到这一点,或者我应该只是做一个脚本来做到这一点?(看起来这个DiskId可能是添加到Heat的好开关?)您可以使用XSLT,使用Heat的-t开关或wixproj中HeatDirectory的Transform属性将DiskId添加到所有文件元素。我使用Heat在每次构建时动态生成wxs文件。XSLT可用于删除文件或用静态Id替换热Id。