Wix/MSI - 如何避免重复安装同一份MSI文件

16

我使用WiX语言编写了我的安装程序。它支持主要升级机制。一个特定的要求是同一MSI文件不可能被安装两次。

现在来到棘手的部分:如果用户在安装后再次尝试安装(UI模式),安装程序将进入维护模式,一切正常(更改/修复将被禁用)。

然而,在静默模式下安装时

msiexec.exe /i installer.msi /qn

第二个安装将继续正常安装(我们不希望这样!)

有一些需要注意的事情:

在第二次安装的日志文件中,序列“FindRelatedProducts”将被跳过(如微软文档http://msdn.microsoft.com/en-us/library/windows/desktop/aa368600(v=vs.85).aspx所述)

另外,我进行了一些调查,发现在这里http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/UpgradeVersion-is-not-detecting-the-same-version-preventing-downgrades-td5875840.html有很好的信息,声称对于这种情况,我们可以使用Installed属性来检测产品是否已安装……

然而,我卡在这里了:因为我必须避免安装先前或与当前版本相同的版本,并允许更大的升级,我该如何在WiX中实现这一点?

感谢您的帮助!


你有没有看过教程中的这一章节:http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization/checking-for-oldies? - Yan Sklyarenko
是的,这是一篇很好的文章,谢谢分享! - Santi Agüero
1
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization/checking-for-oldies - 现在无法访问。 - randomuser15995183
2个回答

14

首先,您需要修复升级代码:

<?define ProductVersion = "0.0.2.3"?>
<?define UpgradeCode = "PUT-GUID-HERE"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

<Product Name="Asd" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Me" Id="*" UpgradeCode="$(var.UpgradeCode)">

请注意,产品代码是每次构建安装时重新创建的(通过使用星号而不是GUID)。

基本信息是产品版本和升级代码。产品代码标识特定部署的发布,而升级代码标识产品发布的“系列”。具有相同升级代码的软件可以彼此切换。具有相同产品代码的软件不能一起安装。

这里是升级软件的技巧:

<Upgrade Id="$(var.UpgradeCode)">
    <!-- Detect older product versions -->
    <UpgradeVersion OnlyDetect="no" IncludeMinimum="yes" IncludeMaximum="yes" Minimum="0.0.1" Maximum="$(var.ProductVersion)" Property="PREVIOUSVERSIONSINSTALLED"/>
    <!-- Detect newer product versions -->
    <UpgradeVersion OnlyDetect="yes" IncludeMinimum="no" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED"/>
</Upgrade>
    <!-- Exits successfully in the case newer version are already installed -->
<CustomActionRef Id="WixExitEarlyWithSuccess"/>
通过使用上面的标记,您告诉Wix在找到一个具有相同的UpgradeCode但已安装的版本大于当前版本的产品时中止安装,但如果找到一个具有相同的UpgradeCode且已安装的版本小于当前版本的产品,则开始安装(升级当前版本)。

< p> IncludeMinimum 和IncludeMaximum 可以解决这个问题,允许升级跳过当前版本。

Wix不会安装相同的产品:您必须确保已安装软件和MSI打包软件的产品代码相同:如果它们不同,则它们是不同的部署软件。除此之外,如果产品具有与MSI相同的产品代码,则安装将提供修复/更改选项:要禁用它们,您必须通过引入ARP_ 变量来操作Wix包的Property 表(您可以禁用修复、更改和卸载,但也可以设置制造商联系方式和其他属性)。


这里是 ARP 变量列表。我不知道在静默模式下安装它们的行为如何,但是如果您从命令行调用msiexec,则有一个特定的修复选项(/f) ,因此如何自动修复您的产品,如果您没有请求?


Luca,非常感谢你的回答。事实上,我恰好拥有你提到的完全相同的升级逻辑。看了Cosmin发布的内容后,我的问题现在是如何避免在完全无声模式下安装时修复相同的MSI(具有相同的版本和相同的产品代码和相同的升级代码),就像我为用户在正常模式下安装时所做的那样?也许可以使用你所述的ARP变量?问候! - Santi Agüero

11

无法完成此操作。

当尝试安装已安装的软件包时,Windows Installer会自动执行修复程序。没有升级过程。

此外,维护过程是基于ProductCode触发的。第二次启动软件包时,Windows Installer看到它的ProductCode已经安装,进入维护模式。它与升级无关。

只有在更改ProductVersion和ProductCode时才使用升级。

编辑:

要防止在维护模式下出现自动修复,您可以尝试以下方法:


感谢您的帮助。非常简洁而且有用的答案。我想知道,就像我已经问@Luca Piccioni一样,您是否知道有什么方法可以避免Windows自动修复(在静默模式下)的行为。问候! - Santi Agüero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接