【问题标题】:WiX and shared, versioned componentsWiX 和共享的版本化组件
【发布时间】:2010-02-24 21:49:52
【问题描述】:

这一定是一个普遍的需求,但我在网络上几乎找不到任何关于它的引用......

我的产品有三组组件,一组安装在服务器上,一组安装在 Web 头上,一组安装在开发人员的机器上。三套都可以安装在一台机器上,应该和平共存。

正如我昨天所做的那样,每个组件都安装到不同的位置并且工作正常,但这只是暂时的,因为应该共享一些文件、gac'd 程序集和注册表设置。现在我已经从共享组件中创建了一个合并模块,这个新的合并模块方案在理想条件下的安装过程中运行良好,并且我已经对单个 msi 进行了重大升级。

问题是在安装 msi 期间,当安装 msi 中的合并模块版本低于已安装版本(不同 msi)的版本时 - 新版本被旧版本覆盖!此外,在卸载三个 msis 中的任何一个时,即使其他已安装的组件仍在使用共享的东西,它也会被删除。

在大多数情况下,我理解为什么会出现这种行为,但我不明白我应该如何配置我的安装程序,以便可以共享这些组件,而无需为共享组件提供单独的安装程序。另外,我也不想要一个大的安装程序 - 这不会很好地扩展。

我想要的是三个安装程序包含合并模块中在构建时可用的任何最新版本的组件。在安装时,如果安装了较新版本的共享组件,请不要覆盖它们。在卸载(和升级)时,应该跟踪的引用计数将决定是否应该删除共享项。

如果我只是遗漏了一些东西,这里是合并文件的重要部分:我的合并模块的版本号(“w.x.y”中的 y)随着每次构建而递增,包 ID 保持固定,并且每个组件有Shared="yes"(虽然我也试过没有这个)。

我已经开始在注册表中存储各种版本号,我想也许只有在注册表中的版本号不存在或更低的情况下,我才能有条件地安装合并模块功能。但是如文档所述,条件参数无法正确评估 w.x.y.z 。然后文档建议 AppSearch,但 AppSearch RegistrySearch 只能检查是否存在,也不能比较版本号。显然 FileSearch 可以,但程序集文件版本号不会随着每次构建而增加。

我读到 MergeModules 有很多问题——也许就是这些——但 wixlibs 似乎也没有为这些问题提供任何解决方案。

那么合并模块版本控制的正确方法是什么???我在亚马逊上找到一本书,其中有一个名为“合并模块版本控制”的 TOC 条目,但该书已绝版。 :-P

【问题讨论】:

  • 我建议将此问题交叉发布到 wix-users 邮件列表。
  • @JasonKleban 你还记得曾经找到过解决方案吗?我遇到了同样的问题,似乎找不到任何好的信息。

标签: wix installation wixlib merge-module


【解决方案1】:

在我看来,我们想要的这种行为 - 始终安装共享组件的最佳版本 - 仅从 MSI 4.5 开始受支持。所以也许这不是 WiX 本身的问题,但我对 WiX 几乎一无所知。

我们希望在共享组件的组件表中设置属性 msidbComponentAttributesShared (0x0800)。也许你可以通过 Orca 来检查你的 MSM。

我认为这篇博文提到了一些相关内容(但在这里可能对您没有太大帮助): http://blogs.msdn.com/windows_installer_team/archive/2008/03/29/windows-installer-4-5-servicing-enhancements-shared-components-and-patch-uninstall.aspx

【讨论】:

  • 好主意,但我不知道如何在 WiX 中应用它。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2019-04-28
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多