【问题标题】:WiX: How do I prevent multiple copies of a bound file being added to an MSI?WiX:如何防止将绑定文件的多个副本添加到 MSI?
【发布时间】:2011-01-18 06:51:38
【问题描述】:

我有一个安装程序,它链接了一个 wixlib。 wixlib 将一个可执行文件安装到多个目录。

当我为 wixlib(使用 -bf 开关)打开“将文件绑定到库文件”时,lit.exe 会将可执行文件添加到 wixlib。但是,当我在 MSI 中链接 wixlib 时,可执行文件会多次添加到 MSI 文件中,从而使安装程序变大。

当我关闭“将文件绑定到库文件”时,问题不会发生(但显然,我需要设置 WiX 安装程序项目以知道在哪里可以找到可执行文件,而不是在 wixlib 中查找)。

使用或不使用 -bf 开关,使用 orca 查看时最终的 MSI 文件看起来相似,所以我很难理解为什么第一种情况下的 MSI 需要包含多个副本。

wixlib wxs 文件如下所示:

<Fragment>

<ComponentGroup Id="cmpFoo1">
  <ComponentRef Id="cmpFooExe1" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH1">
  <Component Id="cmpFooExe1" Guid="*">
    <File Id="filFooExe1" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<ComponentGroup Id="cmpFoo2">
  <ComponentRef Id="cmpFooExe2" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH2">
  <Component Id="cmpFooExe2" Guid="*">
    <File Id="filFooExe2" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<Feature Id="ftFooFeatures" Level="1">
 <ComponentGroupRef Id="cmpFoo1"/>
 <ComponentGroupRef Id="cmpFoo2"/>
</Feature>

</Fragment>

安装程序的 wxs 文件如下:

<Product Id="MyProduct" Name="ProductName" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="{UpgradeCode_Guid}">
<!-- ...etc... -->

<Directory Id="ROOT_TARGET_PATH" Name="Foo">
  <Directory Id="TARGET_PATH1" Name="Foo1" ComponentGuidGenerationSeed="{Guid1}" />
  <Directory Id="TARGET_PATH2" Name="Foo2" ComponentGuidGenerationSeed="{Guid2}" />
</Directory>

<Feature Id="ftMain" Level="1">
  <FeatureRef Id="ftFooFeatures" />
</Feature>

<!-- ...etc... -->
</Product>

预计最终的安装清单将类似于: c:\foo\foo1\foo.exe c:'foo\foo2\foo.exe

有没有办法阻止 WiX(可能是链接器?)将 foo.exe 的多个副本添加到最终的 MSI 文件,同时仍将 foo.exe 与 wixlib 绑定​​?

【问题讨论】:

    标签: wix windows-installer wix3


    【解决方案1】:

    WiX 有一个名为Smart Cabbing 的功能。如果文件元素具有完全相同的源路径属性,WiX 应该会自动为您执行此操作。

    以前在 StackOverflow 上有人问过这个问题,但现在发现还为时过早。 :-) 你可能想要搜索并找到它,因为我记得问题是“我有相同的源路径,为什么它不起作用” Rob Mensching 加入了这个话题,但我不记得了决议是什么。

    【讨论】:

    • 我做了一些阅读,包括 Rob 在 Smart Cabbing 和 Wixlibs 上的帖子,地址为 robmensching.com/blog/posts/2008/10/10/…。我对 lit.exe 在绑定文件时所做的事情有点困惑。 wixlibs 上的帖子建议将cabinet 文件添加到二进制库之前,但我可以看到安装程序在将embedcab 设置为false 的情况下构建时,安装程​​序正在生成自己的cab 文件。为什么 light 需要创建自己的 cab 文件?我会假设它是从 wixlib 中获取的。 (或者这是一个愚蠢的假设 - 我对 wix 有点陌生!)。
    • 更新 - 阅读 WiX 3.5 的更改日志,我注意到 WixBuild:版本 3.5.0619.0 “智能 cabbing 现在捕获所有重复文件,而不仅仅是来自同一源路径的文件(基于文件哈希)。”。我升级到 WiX 3.5,问题解决了。我现在想知道这是否只是 WiX 3.0 中的一个错误,或者 3.5 中的行为转变是否恰好有利于我设计我的 wix 项目的方式。这听起来也与以下问题非常相似:stackoverflow.com/questions/3588066/…
    • 基于散列来做更有意义。
    【解决方案2】:

    为了避免将多个 .exe 副本放入安装程序,我能想到的最好办法是使用 CopyFile 元素。

    如果您考虑不仅要复制您安装的文件,还要复制目标 PC 上存在的其他文件,请记住包含 RemoveFile 元素,因为 such files are not removed by Windows Installer on uninstall

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多