0

这是我的安装执行顺序:

 <InstallExecuteSequence>
            <Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
            <Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>

            <Custom Action="SetInstallParameters" Before="actionInstall"/>
            <Custom Action="SetUninstallParameters" Before="RemoveFiles">Installed AND NOT REINSTALL AND NOT UPGRADINGPRODUCTCODE</Custom>
            <Custom Action="actionInstall" Before="InstallFinalize">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
            <Custom Action="actionUninstall" After="SetUninstallParameters">Installed AND NOT REINSTALL AND NOT UPGRADINGPRODUCTCODE</Custom>
      <Custom Action="LaunchBrowser" After="InstallFinalize">NOT Installed</Custom>
        </InstallExecuteSequence>

所以我需要实现主要的升级功能。名为“actionInstall”的自定义操作负责将 MySQL exe 注册为服务并运行应用程序,该操作通过连接到它并执行我的安装程序中包含的一些 sql 脚本来执行所有必要的数据库更新。

“actionUninstall”负责注销mysql服务。目前我对升级没有任何支持。

我需要实施重大升级。所以在升级时我需要执行以下操作:

  • 复制并替换所有安装程序文件,除了 MySQL 二进制文件(MySQL 被视为永远不会更改)。所有文件都应复制到以前使用过的程序目录(可以是非标准的),无需任何用户确认。

  • 不要执行 SetInstallParameters、actionInstall、SetUninstallParameters 和 actionUninstall。相反,我将创建另一个仅用于升级的自定义操作。它只会执行应用程序来执行数据库升级

  • 不显示任何设置对话框(例如,目标目录选择、许可协议对话框)。

我的问题:

  • 看来,主要升级也会导致执行安装和卸载 - 如何避免它?

  • 如何从复制到目标目录中排除某些文件(MySQL 二进制文件),但仅在升级时(安装时应复制它们)

  • 如何将新文件的目标目录设置为与以前安装时使用的相同(可以是用户在首次安装时选择的任何目录),而不要求用户选择目录?
4

1 回答 1

0

首先要指出几点:

  1. 旧产品的卸载并不是真正的“重大升级”——这是重大升级调用卸载系统上已有的旧产品的结果。您无法阻止卸载的发生,因为它嵌入在较旧的已安装产品中,并且将在重大升级中发生。

  2. 重大升级不是补丁或更新,因为您似乎正在尝试进行更新。它是完全替代旧产品的全新产品。这是一个可供新客户使用的完整产品,在安装整个全新产品的过程中碰巧替换了旧产品。此评论与您关于不替换 SQL 内容的评论确实相关。

因此,除非您更改有关 SQL 事物的要求,否则您可能不需要实现重大升级功能。例如,如果您只是想更新一些文件而不进行卸载,那么您可以构建同一产品的整个 MSI 文件,只更改您希望更新的文件并增加 ProductVersion,使用 msiexec /i 进行安装的小升级... REINSTALL=ALL REINSTALLMODE=vomus 并且不会卸载旧产品 - 您已经完成了就地更新。但我认为你不需要那个。

请注意您对自定义操作的条件!他们已经不会在重大升级(因为 UPGRADINGPRODUCTCODE)或小升级(因为 REINSTALL)时被调用,所以我不清楚你为什么担心在重大升级期间会调用它们。这些电话的设计者预料到了这个问题。

在您的位置上,我会将此作为重大升级:

  1. 包括与以前相同的 SQL 文件。如果二进制文件相同,它们将不会被替换,或者之后会出现相同的二进制文件,那么为什么会出现问题?该安装还可以作为新客户的全新安装。
  2. 正在卸载的旧产品中的自定义操作将不会运行,因为条件中存在 UPGRADINGPRODUCTCODE。
  3. 新产品中的相同自定义操作将在安装期间运行,我假设您不希望这样做,因为它们会破坏现有数据库。在 WiX 主要升级中,使用 not WIX_UPGRADE_DETECTED 条件(以及其他条件)来防止 CA 在其安装时运行。
  4. 如果您想更改或取消对话框,因为这是一次重大升级,请使用 WIX_UPGRADE_DETECTED 更改流程或取消它们。不要删除它们,因为您再次进行重大升级而不是“补丁”。
  5. 如果您想安装到相同的位置,有时使用旧安装中的 WiX 记住属性模式将该安装位置写入注册表很有用,以便您以后可以恢复它。我怀疑您在发货之前没有测试重大升级,所以您需要其他东西。在您要使用的目录中找到一个组件 ID,然后使用 WiX 组件搜索来初始化作为目录名称的属性。

对于未来,请确保您的 CA 条件允许直接卸载正常工作,并且重大升级本质上与全新安装相同,并且替换或更新二进制文件并不重要,因此请确保新的 cuatomers 可以使用它. 此外,如果您需要记住数据文件的安装位置,那么您的设计可能不正确,我怀疑您的数据位于用户可浏览的应用程序文件夹中。数据应位于数据文件夹(例如 AppDataFolder)中,因此您无需担心其在升级时的位置,并帮助受限用户运行您的应用程序,因为他们无法更新 Program Files 目录中的文件。

于 2015-04-21T22:54:34.507 回答