WIX - 阻止执行卸载操作并在主要升级时复制一些文件

时间:2015-04-20 10:47:09

标签: wix custom-action major-upgrade

这是我的安装执行顺序:

 <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>

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

&#34; actionUninstall&#34;负责取消注册mysql服务。目前我没有任何升级支持。

我需要实施重大升级。因此,升级时我需要执行以下操作:

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

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

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

我的问题:

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

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

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

1 个答案:

答案 0 :(得分:0)

首先需要指出几点:

  1. 旧产品的卸载并非真正“进入”主要升级 - 这是主要升级的结果,要求卸载已经在系统上的旧产品。您无法阻止发生卸载,因为它嵌入在较旧的已安装产品中,并且会在重大升级中发生。

  2. 主要升级不是补丁或更新,因为您似乎正在努力实现。它是一种完全取代旧产品的全新产品。这是一个可供新客户使用的整个产品,它可以替代旧产品,作为安装整个全新产品的一部分。此评论与您关于不替换SQL内容的评论有关。

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

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

    在你的位置上我会做这个主要的升级:

    1. 包含与以前相同的SQL文件。如果二进制文件是相同的,它们将不会被替换,或者之后会有相同的二进制文件,那么为什么会出现问题呢?安装也可以作为新客户的全新安装。
    2. 由于条件中的UPGRADINGPRODUCTCODE,将无法运行要卸载的旧产品中的自定义操作。
    3. 新产品中的相同自定义操作将在安装期间运行,我假设您不希望这样,因为它们会破坏现有数据库。在WiX主要升级中,使用非WIX_UPGRADE_DETECTED条件(以及其他条件)来阻止CA在其安装上运行。
    4. 如果您想更改或禁止对话框,因为它是一次重大升级,请使用WIX_UPGRADE_DETECTED来改变流量或抑制它们。不要删除它们,因为再次,您正在进行重大升级而不是“补丁”。
    5. 如果要安装到同一位置,有时可以使用旧版安装中的WiX记住属性模式将该安装位置写入注册表,以便稍后恢复。我怀疑你在发货之前没有测试过主要的升级,所以你还需要别的东西。找到要使用的目录中的组件ID,然后使用WiX组件搜索初始化作为目录名称的属性。
    6. 将来,请确保您的CA条件允许直接卸载正常工作,并且主要升级与全新安装基本相同,更换或更新二进制文件并不重要,因此请确保新的cuatomers可以使用它。此外,如果您需要记住数据文件的安装位置,那么您的设计可能不正确,我怀疑您的数据位于用户可浏览的应用程序文件夹中。数据应位于数据文件夹(例如AppDataFolder)中,因此您无需担心其在升级时的位置并帮助启用有限的用户来运行您的应用程序,因为他们无法更新Program Files目录中的文件。