这是我的安装执行顺序:
<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二进制文件),但仅在升级时(安装时应将其复制)
答案 0 :(得分:0)
首先需要指出几点:
旧产品的卸载并非真正“进入”主要升级 - 这是主要升级的结果,要求卸载已经在系统上的旧产品。您无法阻止发生卸载,因为它嵌入在较旧的已安装产品中,并且会在重大升级中发生。
主要升级不是补丁或更新,因为您似乎正在努力实现。它是一种完全取代旧产品的全新产品。这是一个可供新客户使用的整个产品,它可以替代旧产品,作为安装整个全新产品的一部分。此评论与您关于不替换SQL内容的评论有关。
因此,除非您更改有关SQL事物的要求,否则您可能不需要实现主要升级功能。例如,如果您只是想在不进行卸载的情况下更新某些文件,那么您可以构建同一产品的整个MSI文件,仅更改您希望更新的文件并增加ProductVersion,稍微升级以使用msiexec / i进行安装... REINSTALL =所有REINSTALLMODE = vomus并且不会卸载旧产品 - 您已完成就地更新。但我不认为你需要那个。
请注意自定义操作的条件!它们已经不会被称为主要升级(因为UPGRADINGPRODUCTCODE)或次要升级(因为REINSTALL),所以我不清楚为什么你担心它们会在重大升级期间被调用。这些电话的设计者预见到了这个问题。
在你的位置上我会做这个主要的升级:
将来,请确保您的CA条件允许直接卸载正常工作,并且主要升级与全新安装基本相同,更换或更新二进制文件并不重要,因此请确保新的cuatomers可以使用它。此外,如果您需要记住数据文件的安装位置,那么您的设计可能不正确,我怀疑您的数据位于用户可浏览的应用程序文件夹中。数据应位于数据文件夹(例如AppDataFolder)中,因此您无需担心其在升级时的位置并帮助启用有限的用户来运行您的应用程序,因为他们无法更新Program Files目录中的文件。