在工作中,我们使用WiX来构建安装包。我们希望产品X的安装会导致该机器上该产品以前版本的卸载。
我已经在互联网上的几个地方读到一个重大升级,但不能让它工作。 任何人可以指定我需要采取的确切步骤,以添加卸载以前版本的功能到WiX?
在工作中,我们使用WiX来构建安装包。我们希望产品X的安装会导致该机器上该产品以前版本的卸载。
我已经在互联网上的几个地方读到一个重大升级,但不能让它工作。 任何人可以指定我需要采取的确切步骤,以添加卸载以前版本的功能到WiX?
当前回答
我从教程中漏掉了一件重要的事情(从http://www.tramontana.co.hu/wix/lesson4.php偷来的),导致“此产品的另一个版本已经安装”错误:
*Small updates mean small changes to one or a few files where the change doesn't warrant changing the product version (major.minor.build). You don't have to change the Product GUID, either. Note that you always have to change the Package GUID when you create a new .msi file that is different from the previous ones in any respect. The Installer keeps track of your installed programs and finds them when the user wants to change or remove the installation using these GUIDs. Using the same GUID for different packages will confuse the Installer.
次要升级表示产品版本已经更改的更改。修改Product标签的Version属性。产品将保持不变,因此您不需要更改product GUID,当然,需要获得一个新的Package GUID。
主要升级是指从一个完整版本到另一个完整版本的重大变化。更改所有内容:版本属性、产品和包guid。
其他回答
我使用这个网站来帮助我了解有关WiX升级的基础知识:
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
之后,我创建了一个示例安装程序(安装了一个测试文件),然后创建了升级安装程序(安装了2个示例测试文件)。这将使你对该机制的工作原理有一个基本的了解。
正如Mike在Apress的书中所说,“Windows安装程序的权威指南”,它会帮助你理解,但它不是用WiX写的。
另一个非常有用的网站是这个:
http://www.wixwiki.com/index.php?title=Main_Page
最后我找到了一个解决方案——我把它贴在这里,给其他可能有同样问题的人(你们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
我阅读了WiX文档,下载了示例,但在升级时仍然有很多问题。次要升级不执行以前产品的卸载,尽管有可能指定这些卸载。我花了一天多的时间进行调查,发现WiX 3.5引入了一个用于升级的新标签。用法如下:
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
AllowDowngrades="no" />
但是问题的主要原因是文档中说要在小升级和小升级中使用“重装=ALL REINSTALLMODE=vomus”参数,但它并没有说这些参数在大升级中是禁止的——它们只是停止工作。所以你不应该在重大升级时使用它们。
您最好在WiX-users邮件列表中询问这个问题。
WiX最好在充分理解Windows安装程序的情况下使用。你可以考虑获得“Windows安装程序权威指南”。
删除现有产品的操作是RemoveExistingProducts操作。因为它所做的事情的结果取决于它的计划位置——即,失败是否导致旧产品重新安装,以及是否再次复制未更改的文件——您必须自己计划它。
RemoveExistingProducts processes <升级当前安装中的>元素,将@Id属性匹配到系统上所有已安装产品的UpgradeCode(在<Product>元素中指定)。UpgradeCode定义了一系列相关产品。任何具有此UpgradeCode的产品,其版本落在指定的范围内,且UpgradeVersion/@OnlyDetect属性为no(或省略),将被删除。
RemoveExistingProducts的文档提到了设置UPGRADINGPRODUCTCODE属性。这意味着要移除的产品的卸载过程接收到该属性,其值是正在安装的产品的product /@Id。
如果您的原始安装不包括升级码,您将无法使用此功能。
以下是我用于主要升级的语法:
<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必须相同。