在工作中,我们使用WiX来构建安装包。我们希望产品X的安装会导致该机器上该产品以前版本的卸载。
我已经在互联网上的几个地方读到一个重大升级,但不能让它工作。 任何人可以指定我需要采取的确切步骤,以添加卸载以前版本的功能到WiX?
在工作中,我们使用WiX来构建安装包。我们希望产品X的安装会导致该机器上该产品以前版本的卸载。
我已经在互联网上的几个地方读到一个重大升级,但不能让它工作。 任何人可以指定我需要采取的确切步骤,以添加卸载以前版本的功能到WiX?
当前回答
Product元素中的Upgrade元素,结合适当的操作调度,将执行您所需要的卸载。确保列出所有要删除的产品的升级代码。
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
<UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
请注意,如果您对构建非常谨慎,就可以防止人们意外地安装较旧版本的产品而不是较新的版本。这就是Maximum字段的作用。当我们构建安装程序时,我们将UpgradeVersion Maximum设置为正在构建的版本,但是IncludeMaximum="no"以防止这种情况。
您可以选择有关RemoveExistingProducts的调度。我更喜欢把它安排在InstallFinalize之后(而不是其他人推荐的InstallInitialize之后):
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>
在复制新文件和注册表项之前,将一直安装以前版本的产品。这让我可以将数据从旧版本迁移到新版本(例如,您已经将用户首选项的存储从注册表切换到XML文件,但是您希望礼貌地迁移他们的设置)。这个迁移是在InstallFinalize之前的一个延迟自定义操作中完成的。
另一个好处是效率:如果有未更改的文件,当你在InstallFinalize之后调度时,Windows安装程序不会费心再次复制它们。如果在InstallInitialize之后进行调度,则会首先完全删除以前的版本,然后安装新版本。这会导致不必要的删除和重新复制文件。
有关其他调度选项,请参阅MSDN中的RemoveExistingProducts帮助主题。本周的链接是:http://msdn.microsoft.com/en-us/library/aa371197.aspx
其他回答
以下是我用于主要升级的语法:
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
<UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
正如@Brian Gillespie指出的,根据所需的优化,还有其他地方可以安排RemoveExistingProducts。注意,PUT-GUID-HERE必须相同。
这对我来说很管用,即使我的主要成绩是DOWN:
<Wix ...>
<Product ...>
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowDowngrades="yes" />
最后我找到了一个解决方案——我把它贴在这里,给其他可能有同样问题的人(你们5个人):
将产品ID更改为* 产品下添加以下内容: <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <升级Id = " YOUR_GUID " > < UpgradeVersion 最大最小= " 1.0.0.0 " = " 99.0.0.0 " 属性= " PREVIOUSVERSIONSINSTALLED " IncludeMinimum="yes" IncludeMaximum="no" /> > < /升级 在InstallExecuteSequence下添加: <RemoveExistingProducts Before="InstallInitialize" />
从现在开始,每当我安装产品,它删除以前安装的版本。
注意:请将升级Id替换为自己的GUID
下面的内容对我很有用。
<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0"
Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
<UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0"
RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
请确保“产品”中的“升级码”与“升级”中的“Id”匹配。
我建议你看看Alex Shevchuk的教程。他在《从MSI到WiX,第8部分-主要升级》中用一个很好的实例解释了通过WiX进行的“重大升级”。