Wix / MSI - 如何避免两次安装相同的MSI

时间:2011-10-05 03:49:07

标签: wix windows-installer upgrade

我的安装程序是用WiX语言编写的。它支持主要的升级机制。特别要求是相同的MSI文件无法安装两次。

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

但是,当我们的用例以静默模式进行安装时

msiexec.exe / i installer.msi / qn

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

需要注意的一些事项是:

在第二次安装的日志文件中,将跳过序列“ FindRelatedProducts ”(在microsoft文档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 属性来检测Product是否已经安装......

但是,我被困在这里:因为我必须避免安装以前或相同版本而不是现有版本并允许升级更大,我怎样才能在WiX中实现这一目标?

感谢您的帮助!

2 个答案:

答案 0 :(得分:13)

首先,您将修复升级代码:

<?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"/>

通过使用上面的标记,当他找到具有相同 UpgradeCode 的产品但是已安装的产品的版本大于当前版本时,对Wix中止安装说,但如果他发现产品具有相同的 UpgradeCode 并且已安装的产品的 Version 小于当前产品,则开始安装(升级当前版本)。

IncludeMinimum IncludeMaximum 应该可以解决问题,允许升级跳过当前版本。

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


这是ARP variable list。我不知道在静默模式下安装时他们的行为是什么,但是如果你从命令行调用msiexec,有一个特定的修复选项来发出修复(/ f),那么如果你是的话,如何自动修复你的产品不要求?

答案 1 :(得分:10)

这不可能。

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

此外,基于ProductCode触发维护过程。第二次Windows Installer发现其ProductCode已安装并进入维护模式时启动程序包时。它与升级没有任何关系。

升级仅在更改ProductVersion和ProductCode时使用。

编辑:

要防止在维护模式下进行自动修复,您可以尝试: