如何在WIX安装中使用ReuseCabinetCache

时间:2012-01-31 20:46:45

标签: wix wix3.5

类似问题:Reusing WIX components to speed up candle/light

我的项目与引用的项目有同样的问题;每次需要构建时,一个永不改变的非常大的静态数据库被压缩到msi中。我想问一下这个问题:重复使用预压缩的cab文件来加快构建时间。

我开始按照回答的建议,使用cabCache属性。我在.wixproj中添加了以下内容:

<CabinetCachePath>cabs</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>

然后我将静态数据分成一个片段:

<Fragmet>
  <Media Id="2" Cabinet="static.cab" EmbedCab="no" />
  <Component Id="staticCab" Guid="..." >
    Files ...
  </Component>

该片段在功能中引用:

<ComponentRef Id="staticCab" />

这创建了cab文件,但是将其留空。我的下一个想法是使用合并模块。我创建了模块:

<Module Id="StaticModule" Language="1033" Version="1.0.0.0" >
  <Package ...>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="MergeRedirectFolder" Name=".">
        <Component Id="StaticFiles" Guid="...">
          Files...
        </ -- End all XML Tags

然后合并它:

<Directory Id="StaticDir" Name="static">
  <Merge Id="StaticModule" Language="1033" src="..\Static\bin\Release\static.msm" />
</Directory>

<Feature ...>
  <MergeRef Id="StaticModule"/>
</Feature>

即便在这之后,每次都会重建CabinetCache。

我想我的问题是使用ReuseCabinetCache的正确方法是什么。我还在学习WIX,所以如果答案很明显我会道歉。我只是不确定如何使用它。

编辑: MergeModule不理想,因为不需要与其他msi共享该逻辑。它对单个项目只对单个开发团队有用。

1 个答案:

答案 0 :(得分:3)

我会继续回答我自己的问题,因为结果很简单。

更改.wxiproj以在

中包含这些属性
<CabinetCachePath>cabs</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>

将媒体添加到.wxs安装

<Media Id="2" Cabinet="static.cab" EmbedCab="yes" />

在存储静态文件的目录标记中,添加DiskId="2"

这会做几件事。首先,你告诉Wix你不要将机柜存放在重用机柜的路径中。创建新机柜并仅在其中存储静态数据(或不经常更改的数据)将导致Wix使用机柜的缓存版本。 Wix通过确保:

来验证机柜
  • 缓存机柜中的文件数与正在构建的文件数相匹配。
  • 文件的名称都相同。
  • 文件的顺序相同。
  • 所有文件的时间戳都相同。

(资料来源:http://wix.sourceforge.net/manual-wix3/optimizing_builds.htm

难怪我找不到任何文件。很容易做到这一点应该对我很明显。

更新:此外,多个线程用于构建多个机柜。创建多个机柜将进一步提高速度。