【问题标题】:Reboot on install, Don't reboot on uninstall安装时重启,卸载时不要重启
【发布时间】:2018-07-28 03:50:00
【问题描述】:

我们有一个安装程序需要在安装时重新启动,但它也在卸载时重新启动。卸载时有什么方法可以防止重启?

这是我们目前拥有的:

<InstallExecuteSequence>
  <ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>

非常感谢!

【问题讨论】:

    标签: wix windows-installer wix3 major-upgrade


    【解决方案1】:

    重启管理器The Restart Manager Feature of Windows (Installer)(middle page) is designed to help restart applications automatically during installation rather than requiring a reboot

    • 应始终使用此功能来尝试消除重新启动要求。
    • 只有在非常特殊的情况下才真正需要重新启动。

    技术速成课程:这是在您的应用程序中实施 Restart Manager 的技术花絮和建议 - 来自 Advanced Installer,制造商领先的部署工具:

    更新MSI Expert Phil Wilson on Restart Manager(对于某些 Restart Manager 现实检查 - 请阅读)。


    为 ScheduleReboot 添加条件

    您需要按照此处描述的内容为您的ScheduleReboot 条目插入一个条件:https://www.firegiant.com/wix/tutorial/events-and-actions/extra-actions/(链接的文章可能显示​​的条件有点过于包容或不受限制)。


    更新:有一些问题需要考虑:

    1. 意外操作:除非确实有必要,否则绝不应使用 ScheduleReboot。例如,如果您尝试替换正在使用的文件,MSI 将在不调用 ScheduleReboot 的情况下处理该问题。

    2. 多种安装模式:如果没有适当的条件,ScheduleReboot 将导致在多种安装模式下出现重启提示:安装、卸载、升级、修复、自我- 修复、修补等...这是不可取的。

    3. 静默、即时重启:如果 MSI 在静默模式下运行且未指定 REBOOT=ReallySuppress,ScheduleReboot 操作将自动触发计算机的即时重启有问题 - 这可能非常令人惊讶且非常不受欢迎。


    出于您的目的,您或许可以使用以下条件:

    <InstallExecuteSequence>
        <ScheduleReboot After='InstallFinalize'>NOT Installed AND NOT WIX_UPGRADE_DETECTED</ScheduleReboot>
    </InstallExecuteSequence>
    

    这完全取决于您是要在重大升级期间安排重启,还是仅在原始的全新安装期间安排重启?信息。像NOT Installed AND NOT REMOVE~="ALL" 这样的普通情况似乎会在重大升级期间安排重新启动,但不适用于不是由重大升级触发的手动卸载(我会在有机会时进行测试 - 更新:经过验证,仅限基本测试)。

    请注意,特殊的 WIX_UPGRADE_DETECTED 属性是 WiX-specific construct,只有在使用 WiX 的 MajorUpgrade 元素时才能设置。您也可以set up major upgrades the old fashioned way in WiX 并避免使用 MajorUpgrade 元素“便利功能”,它允许使用更少的选项更轻松地配置主要升级 - “自动魔术”。我没有验证WIX_UPGRADE_DETECTED 是否仍然使用这种“老派”主要升级配置进行设置。

    您还可以使用 Upgrade table 中的 ActionProperty 来检测“即将发生”重大升级 (see this answer for a sample)。这甚至适用于非 WiX MSI 设置 - 因此应该是 WIX_UPGRADE_DETECTED 的替代品(我相信此属性是在 FindRelatedProducts 运行后设置的)。


    WIX_UPGRADE_DETECTED 与 UPGRADINGPRODUCTCODE

    在主要升级期间卸载的 MSI 软件包将设置特殊属性 UPGRADINGPRODUCTCODE(不会在升级期间安装的 MSI 中设置)。这是一个内置的 MSI 属性,而不是特定于 WiX 的构造。换句话说,在重大升级期间 - 卸载旧版本并安装新版本 - 正在卸载的 MSI 将设置属性 UPGRADINGPRODUCTCODE,而正在安装的 MSI 将设置属性 WIX_UPGRADE_DETECTED (我将很快验证这一点)。在标准操作FindRelatedProducts 运行后,它还将具有来自升级表设置的 ActionProperty。

    如果这听起来很复杂,那么恐怕就是这样。这是 Windows Installer 的一个关键问题 (despite the technology's major corporate benefits) - 基本的、关键的操作——比如升级——有时很难正确处理。 the principle of least astonishment 可能存在一些违规行为。所有技术都有好有坏 - 很明显。


    特别注意事项

    请注意,无论ScheduleReboot action 是否被抑制,都可能会启动重新启动(例如,如果存在无法替换的文件 - 或更糟糕的是:自定义操作通过代码强制重新启动 - 这总是错误的,应该安排重启而不是通过代码强制)。

    您可以使用REBOOT property(您已经阅读过的内容)来禁止某些系统重启提示。 More on System Reboots.


    MSI 条件

    要正确处理 MSI 条件可能非常棘手。弄错了,您的操作会在错误的安装模式下意外运行 - 或者它在应该运行的时候根本没有运行。这比你想象的更容易出错——即使有经验。证据就在这里,现实生活中的测试。以下是一些复杂条件的示例Wix Tools update uses old custom actions(以防万一)。

    当您尝试使用复杂条件(或任何与此相关的条件)时,您应该测试多种安装模式:1. fresh install2. repair3. modify4. self-repair5. patching、@987654360 @、7. major upgrade invoked uninstall 等...还有一些奇怪的模式,例如以RESUME property 为特色的恢复暂停安装,以及与ForceReboot action 相关的AFTERREBOOT property 等...人们应该记住的事情是很少测试。

    这里有两个用于调节的“备忘单”:

    我没有时间检查所有这些条件并对其进行测试,但后一张表从表面上看是合理的。但是:我相信REMOVE 有时可以在安装期间(和更改期间)设置。由于 MSI 的命令行界面和属性配置非常灵活,因此处理所有可能性排列非常复杂。 Installed 也没有为作为主要升级的一部分安装的新 MSI 版本设置,但它将为正在卸载的 MSI 版本设置 - 非常混乱。

    Installshield 备忘单 我从未积极使用或检查过,但我发现他们对repair 的建议至少可以说很有趣 - 根据调用修复的方式,有不同的条目。

    请记住还要检查自我修复 - 只需删除主应用程序 EXE 并通过调用应用程序的广告快捷方式(如果有)来触发自我修复。我检查已经有好几年了,但自我修复可能只在 InstallInitialize 和 InstallFinalize 之间运行操作。您不想在自我修复期间安排重启。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2011-04-09
      • 1970-01-01
      • 2018-11-01
      • 2011-06-03
      相关资源
      最近更新 更多