【问题标题】:Disable repair mode and upgrades in wix installer在 wix 安装程序中禁用修复模式和升级
【发布时间】:2018-04-13 04:40:50
【问题描述】:

我们有一个使用 wix 创建 msi 的独特要求,问题是 msi 必须支持多实例安装。用户应该能够使用 msi 在特定系统上多次安装产品​​,因此为了实现这一点,我们应该禁用 msi 中的修复模式和升级,因此从字面上看,每次调用 msi 都应该被视为全新安装。

上述要求在 Wix 上是否可行?我知道每次调用 msi 都有唯一的产品代码和包代码会将安装视为全新安装。这可以使用围绕 msi 的包装器来实现吗?

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    您可以使用 MSI 周围的包装器来执行此操作。通常,您的包装程序将从基本 MSI 开始,使用 Windows 安装程序 API 更改 ProductCode 和 PackageCode,将此 MSI 复制到系统上的某个位置,然后从那里安装它。

    我说“复制并安装”是因为尝试禁用修复是徒劳的——它已经融入了 Windows Installer 的体系结构。如果您将每个单独的 MSI 产品缓存在某处,则修复将使用该唯一的 MSI 进行,这也意味着您也可以进行修改。修复太不可预测,无法完全防止。任何共享文件都可以从共享它们的其他已安装产品触发修复。如果客户不小心删除了文件或注册表项,他们会怎么做?还有一个关于保持源 MSI 可用的问题,尽管原因列表没有太多解释,规则 31:

    https://blogs.msdn.microsoft.com/windows_installer_team/2006/05/24/tao-of-the-windows-installer-part-3/

    还有很多其他问题没有提到,所以不清楚你是否关心补丁和维护,关于程序/功能中的多个条目(你可以禁止,但你如何卸载?)等等。也不清楚这些单独的安装中的每一个都不会以任何方式相互冲突,例如公共文件/注册表条目、服务名称、以相同名称安装在同一位置的文件。

    【讨论】:

      【解决方案2】:

      在将您发送到 MSI SDK 之前,我应该补充一点,我自己不喜欢这个实例转换概念,并且没有在实践中使用它。可能我变成了一个脾气暴躁的老人! :-)。

      MSINEWINSTANCE:请调查 MSINEWINSTANCE property 并阅读 MSI SDK 主题:“Installing Multiple Instances of Products and Patches”。还有here is perhaps a better example - 更实用。

      另外some context 解释了为什么我不太喜欢这个功能。 Carolyn Napier 是最初的 MSI 团队的成员 - 正如他们所说,这是直接从马的嘴里说出来的。

      我知道有些人声称使用这些实例转换取得了成功(Chris Painter 或许可以在这里阐明我的主张),但我宁愿在诸如此类的场景中进行虚拟化。 请参阅 serverfault.com 的这篇古老的帖子:I want to install an MSI twice(也请浏览该“线程”中的所有其他答案)。


      APP-V:我的 App-V 经验几乎为零,但我的猜测是,您应该尝试说服您的经理花一些时间在这方面调查。也许会打电话给一些人情,并与在当前部署中运作的人交谈。他们总是要报道当前普遍存在的偏见 - 使用使事情在现实世界中发挥作用的技巧。

      如果您能告诉我们您最终是如何解决问题的,那就太好了。


      禁用修复和修改:记录一下:disabling repair and modify (buttons only) 可以通过设置ARPNOMODIFY 和ARPNOREPAIR 属性来完成。但这不是您要允许多个实例安装的内容。 MSI 不容易被愚弄,并且知道您安装了什么以及何时安装 - 没有理由浪费时间测试这些“选项”。 这两个属性的作用是隐藏或禁用修改和修复按钮——除此之外什么都不会产生。。

      【讨论】:

      • ARPNOREPAIR 的文档并没有禁用修复,它只是隐藏了 Programs-Features 等中的按钮,正如文档所说。
      • 是的,我已经说明了我的想法。也许我说得不够清楚。我能问一下您对实例转换的看法吗?你用它们吗?我问的是不可能的一句话总结:-)。
      • Stein,您的文字说“禁用...修复...”可以通过设置 ARPNOREPAIR 属性来完成。它不会这样做——它只是隐藏了显式按钮,我相信你知道修复有时会自发发生。所以是的,它的措辞可能会有所不同,但我可能对措辞过于着迷。
      • 好的,我在底部加粗了我声明属性只是禁用/隐藏按钮的部分。并且还修改了您在顶部阅读的链接 - 我添加了“(仅限按钮)”。措辞没有问题 - 很高兴收到反馈。希望现在很清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      相关资源
      最近更新 更多