我们在工作中使用 维克斯 对大楼安装软件包。我们希望,安装X产品将导致在卸载前的版本那样的产品上,机。

我读过几个地方在互联网上约一个重大的升级,但不能得到它的工作。任何人都可以请指定确切的步骤,我需要添加卸载前的版本功能为维克斯?

有帮助吗?

解决方案

在最新版本(来自3.5.1315.0测试版)中,您可以使用 MajorUpgrade元素而不是使用自己的。

例如,我们使用此代码进行自动升级。它可以防止降级,提供本地化的错误消息,还可以防止升级现有的相同版本(即只升级较低版本):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

其他提示

最后我找到一个解决方案--我将在这里为其他人可能会有同样的问题(所有5您):

  • 改变产品ID*
  • 在产品添加以下内容:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • 在InstallExecuteSequence添加:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

从现在每当我安装该产品,它删除了以前安装的版本。

注: 替换升级Id用自己的GUID

以下是我用于主要升级的语法:

<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必须相同。

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 = <!> quot; no <!> quot;防止出现这种情况。

您可以选择RemoveExistingProducts的计划。我更喜欢在InstallFinalize之后安排它(而不是像其他人推荐的那样在InstallInitialize之后):

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

这将保留产品的先前版本,直到复制新文件和注册表项为止。这使我可以将数据从旧版本迁移到新版本(例如,您已将用户首选项的存储从注册表切换到XML文件,但您希望礼貌并迁移其设置)。此迁移在InstallFinalize之前的延迟自定义操作中完成。

另一个好处是效率:如果文件未更改,则在安装FinalFinalize之后安排时,Windows Installer不会再次复制它们。如果您在InstallInitialize之后安排,则先完全删除先前版本,然后安装新版本。这导致不必要的删除和重新复制文件。

有关其他计划选项,请参阅MSDN中的RemoveExistingProducts帮助主题。本周链接为: http://msdn.microsoft.com/en-我们/库/ aa371197.aspx

您可能最好在 WiX用户邮件列表上询问此问题。

WiX最适合用于深入了解Windows Installer正在做什么。您可以考虑“ Windows Installer权威指南 <!> QUOT;

删除现有产品的操作是 RemoveExistingProducts操作。因为它所做的后果取决于它的安排位置 - 即,故障是否导致重新安装旧产品,以及是否再次复制未更改的文件 - 您必须自己安排。

RemoveExistingProducts处理当前安装中的<Upgrade>元素,将@Id属性与系统上所有已安装产品的UpgradeCode(在<Product>元素中指定)相匹配。 UpgradeVersion/@OnlyDetect定义了一系列相关产品。任何具有此UpgradeCode且其版本属于指定范围且no属性为UPGRADINGPRODUCTCODE(或省略)的产品将被删除。

Product/@Id的文档提及设置<=>属性。这意味着要删除的产品的卸载过程 会收到该属性,其值为正在安装的产品的<=>。

如果您的原始安装不包含<=>,则无法使用此功能。

我使用此网站来帮助我了解有关WiX升级的基础知识:

http://wix.tramontana.co.hu/tutorial/upgrades -and-模块化

之后我创建了一个示例安装程序,(安装了一个测试文件),然后创建了升级安装程序(安装了2个示例测试文件)。这将使您基本了解该机制的工作原理。

正如Mike在Apress的书中所说,<!>“Windows安装程序的权威指南<!>”,它将帮助您理解,但它不是使用WiX编写的。

另一个非常有用的网站就是这个:

http:// www .wixwiki.com /的index.php?标题= Main_Page

我阅读了 WiX 文档,下载了示例,但我仍然遇到了很多问题升级。尽管可以指定卸载,但次要升级不会执行以前产品的卸载。我花了一天时间进行调查,发现WiX 3.5引入了一个新标签进行升级。以下是用法:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

但问题的主要原因是文档说要使用<!>“ REINSTALL = ALL REINSTALLMODE = vomus <!>”;小型和小型升级的参数,但并未说明这些参数 FORBIDDEN用于主要升级 - 它们只是停止工作。所以你不应该在重大升级时使用它们。

我建议看一下Alex Shevchuk的教程。他解释了<!>“主要升级<!>”;通过WiX,在从MSI到WiX,第8部分 - 重大升级

我从教程中遗漏了一段时间的一件重要事情(从 http://www.tramontana.co .hu / wix / lesson4.php )导致<!>“;此产品的另一个版本已经安装<!>”;错误:

* 小更新 意味着对一个或几个文件进行微小更改,而这些更改无法保证更改产品版本(major.minor.build)。您也不必更改产品GUID。请注意,在创建与以前版本不同的新.msi文件时,始终必须更改包GUID。安装程序会跟踪已安装的程序,并在用户想要使用这些GUID更改或删除安装时查找它们。对不同的包使用相同的GUID会使安装程序混淆。

次要升级 表示产品版本已更改的更改。修改Product标记的Version属性。产品将保持不变,因此您无需更改产品GUID,但当然会获得新的包GUID。

主要升级 表示从一个完整版本转到另一个完整版本等重大更改。更改所有内容:版本属性,产品和包GUID。

我正在使用最新版本的WiX(3.0),无法完成上述工作。但这确实有效:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

请注意,PUT-GUID-HERE应与您在Product的UpgradeCode属性中定义的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>

请确保产品中的UpgradeCode与升级中的ID匹配。

这对我有用,即使主要 DOWN 等级:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top