使用WiX 3.5,我有一个带有实例转换的MSI,允许我在具有不同产品名称的同一台机器上安装软件。为此,我在条件定义的.wxs文件中有一个“硬编码”的产品ID和名称列表。但是,我只有一个包含文件和非文件资源的Feature-ComponentRef定义。
安装似乎工作正常,但卸载实例演示了这两个来源中提到的行为:
http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx
和
具体来说,除了我的应用程序的最后一个实例之外,没有任何非文件资源(在本例中为注册表项)被卸载。 (例如,如果我按此顺序卸载:instance1,instance2和instance3 - 只删除instance3的非文件资源。
我认为这与非文件组件没有唯一的GUID有关(而这对文件组件来说不是问题)
所以,我想知道一种有效的方法是使用一个产品ID,名称和一组功能来定义单个.wxs文件,但是有一个自定义引导程序为产品和非文件组件生成新的GUID。然后在运行时插入MSI数据库?即,当需要卸载或更新时,我会在注册表中查询已安装的实例,然后检索它们的GUID。
这将允许在运行时创建实例,而不是事先在.wxs中硬编码,并且可以干净地卸载。
这有意义吗? Burn会让一切变得更好吗? :)
答案 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为我创建了快捷方式。