MSI / WiX - 在多实例转换期间分配组件GUID

时间:2011-02-18 21:23:12

标签: wix install burn

使用WiX 3.5,我有一个带有实例转换的MSI,允许我在具有不同产品名称的同一台机器上安装软件。为此,我在条件定义的.wxs文件中有一个“硬编码”的产品ID和名称列表。但是,我只有一个包含文件和非文件资源的Feature-ComponentRef定义。

安装似乎工作正常,但卸载实例演示了这两个来源中提到的行为:

http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Multiple-Instance-Transforms-Walkthrough-Proposed-Simple-Addition-to-WiX-to-Make-Them-Easier-td708828.html

具体来说,除了我的应用程序的最后一个实例之外,没有任何非文件资源(在本例中为注册表项)被卸载。 (例如,如果我按此顺序卸载:instance1,instance2和instance3 - 只删除instance3的非文件资源。

我认为这与非文件组件没有唯一的GUID有关(而这对文件组件来说不是问题)

所以,我想知道一种有效的方法是使用一个产品ID,名称和一组功能来定义单个.wxs文件,但是有一个自定义引导程序为产品和非文件组件生成新的GUID。然后在运行时插入MSI数据库?即,当需要卸载或更新时,我会在注册表中查询已安装的实例,然后检索它们的GUID。

这将允许在运行时创建实例,而不是事先在.wxs中硬编码,并且可以干净地卸载。

这有意义吗? Burn会让一切变得更好吗? :)

2 个答案:

答案 0 :(得分:4)

从版本v3.6.1511.0开始,组件现在有一个“MultiInstance”属性。根据Josh Rowes在WiX邮件列表中的帖子中的建议,这允许每个实例动态生成一个guid(参见OP中的链接)。我已经测试过,这可以正常工作,以便在卸载当前实例时删除注册表数据,而不是在卸载LAST实例时删除。

答案 1 :(得分:1)

您不需要具有唯一的组件ID,但您需要具有唯一的注册表项。退房:

Authoring Multiple Instances with Instance Transforms

文章提到:

  

保留每个的非文件数据   实例隔离,基础包   应该将非文件数据收集到集合中   每个实例的组件。该   那么应该是适当的组件   基于条件安装   依赖于实例的语句   标识符

我实际上不知道他们在那里谈论什么。我创建了n-Tier多实例安装程序,其中所有文件都由唯一的INSTALLDIR隔离(运行时类型51自定义操作以基于InstanceID改变目标)并且所有注册表数据都使用InstanceID作为路径的一部分进行了变异,如上所述在文章中。我支持最多16个具有唯一配置数据和唯一版本#的独特实例(每个实例都可以通过除其他实例之外的主要升级来提供服务。)所有这些都是为了支持nTier应用程序的SaaS部署模型而我从不曾经不得不创建具有唯一GUIDS和/或条件表达式的组件。

我唯一不得不做的就是在客户端,他们想在桌面上使用快捷方式。 (客户端也支持多个实例,因为站点可能在生产中具有v1.0,在测试中具有v1.1)

因为我无法改变文件夹名称(固定)并且因为MSI的ShortCut表不支持formattable,所以我必须编写一个自定义操作来使用InstanceID在安装表中动态创建ShortCut到TEMP表中然后MSI为我创建了快捷方式。