这必须是一个普遍的需求,但我在网上几乎找不到任何对它的引用......
我有一个产品,它有三组组件,一组安装在服务器上,一组安装在 Web 头上,一组安装在开发人员的机器上。所有三套都可以安装在一台机器上,并且应该和平共存。
正如我昨天所做的那样,每个组件都安装到不同的地方并且工作正常,但这只是暂时的,因为应该共享一些文件、gac'd 程序集和注册表设置。现在我已经从共享组件中创建了一个合并模块,并且这个新的合并模块方案在理想条件下的安装过程中运行良好,并且我已经对单个 msi 进行了重大升级。
问题是在安装 msi 期间,安装 msi 中的合并模块版本低于已安装版本(不同 msi)的版本 - 较新版本被旧版本覆盖!此外,在卸载三个 msis 中的任何一个时,即使其他已安装的组件仍在使用共享的东西,它也会被删除。
在大多数情况下,我理解为什么会出现这种行为,但我不明白我应该如何配置我的安装程序,以便可以共享这些组件,而无需为共享组件提供单独的安装程序。另外,我也不想要一个大的安装程序 - 这不会很好地扩展。
我想要的是三个安装程序包含合并模块中在构建时可用的任何最新版本的组件。在安装时,如果安装了较新版本的共享组件,请不要覆盖它们。在卸载(和升级)时,应该跟踪的引用计数将确定是否应该删除共享项目。
如果我只是遗漏了一些东西,这里是合并文件的重要部分:我的合并模块的版本号(“wxy”中的 y)随着每次构建而递增,包 ID 保持固定,并且每个组件都有Shared="yes"
(尽管我也试过没有这个)。
我已经开始在注册表中存储各种版本号,我想也许只有在注册表中的版本号不存在或更低的情况下,我才能有条件地安装合并模块功能。但是如文档所述,条件参数无法正确评估 wxyz 。然后文档建议 AppSearch,但 AppSearch RegistrySearch 只能检查是否存在,也不能比较版本号。显然 FileSearch 可以,但程序集文件版本号不会随着每次构建而增加。
而且我读到 MergeModules 有很多问题——也许就是这些——但 wixlibs 似乎也没有为这些问题提供任何解决方案。
那么合并模块版本控制的正确方法是什么???我在亚马逊上找到一本书,其中有一个名为“合并模块版本控制”的 TOC 条目,但该书已绝版。:-P