【问题标题】:MSI/WiX - Assigning Component GUID's during Multiple Instance TransformsMSI/WiX - 在多实例转换期间分配组件 GUID
【发布时间】:2011-02-18 21:23:11
【问题描述】:

使用 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会让一切变得更好吗? :)

【问题讨论】:

    标签: wix installation burn


    【解决方案1】:

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

    【讨论】:

    • 哇!我迫不及待想试试这个!谢谢!
    【解决方案2】:

    您不需要拥有唯一的组件 ID,但您需要拥有唯一的注册表项。签出:

    Authoring Multiple Instances with Instance Transforms

    文章提到:

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

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

    我唯一需要做的就是在客户端,他们想要在桌面上有一个快捷方式。 (客户端支持多个实例也是因为一个站点可能在 Production 中具有 v1.0,在 Test 中具有 v1.1)

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

    【讨论】:

    • 嗨克里斯托弗 - 感谢您的回复。你是对的,我可以改变注册表数据,但问题发生在卸载时。只有最后一个卸载实例的注册表数据实际被删除 - 所有之前的卸载都无法删除注册表数据。这就是我理解独特组件 GUID 的来源。Josh Rowe 在 wix-users 邮件列表中的帖子(OP 中的链接)描述了这一点 - 大约是他帖子的 2/3-3/4。
    • 我将不得不玩这个。自 2006/2007 年以来,我没有进行过多实例安装,我只是不记得这是个问题。我很确定那些安装有一些注册表数据,但也许没有,也许我只是所有的 XML。
    • 实际上,我知道我有注册表数据。我用它来保存 INSTALLDIR 数据,这样当我进行重大升级时,新的 MSI/实例将能够解析原始安装/实例配置的位置。我将对此进行模拟以刷新我的记忆。
    • 好的,我的立场是正确的。当我说“我不知道他们在说什么”时,应该是“我不知道我在说什么!” :-) 我刚刚模拟了一个安装程序,我看到了和你一样的行为。
    • 快捷方式的自定义操作看起来如何?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多