代码之家  ›  专栏  ›  技术社区  ›  Dror Helper

如何实现WiX安装程序升级?

  •  223
  • Dror Helper  · 技术社区  · 16 年前

    WiX 用于建筑安装包。我们希望产品X的安装将导致在该机器上卸载该产品的早期版本。

    我在互联网上的好几个地方读到了关于重大升级的消息,但都没能让它生效。 任何人都可以指定确切的步骤,我需要采取添加卸载以前的版本功能到WiX?

    12 回复  |  直到 15 年前
        1
  •  224
  •   ssingh3 Dror Helper    13 年前

    最后我找到了一个解决方案——我在这里为可能有相同问题的其他人(你们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" /> 
      

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

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

        2
  •  205
  •   Rowland Shaw    7 年前

    在最新版本(3.5.1315.0测试版)中,您可以使用 MajorUpgrade element

    例如,我们使用此代码进行自动升级。它可以防止降级,给出本地化的错误消息,还可以防止升级已经存在的相同版本(即仅升级较低版本):

    <MajorUpgrade
        AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
        AllowSameVersionUpgrades="no"
        />
    
        3
  •  89
  •   Rob Mensching    15 年前

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

        4
  •  40
  •   Brian Gillespie    16 年前

    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>
    

    请注意,如果您对构建非常小心,您可以防止人们意外地在较新版本上安装较旧版本的产品。这就是最大字段的作用。在构建安装程序时,我们将UpgradeVersion Maximum设置为正在构建的版本,但IncludeMaximum=“否”可防止出现这种情况。

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

    这将保留在复制新文件和注册表项之前安装的产品的早期版本。这使我能够将数据从旧版本迁移到新版本(例如,您已将用户首选项的存储从注册表切换到XML文件,但您希望礼貌地迁移它们的设置)。此迁移在InstallFinalize之前的延迟自定义操作中完成。

    另一个好处是效率:如果有未更改的文件,Windows Installer在您计划在InstallFinalize之后复制它们时就不会麻烦了。如果计划在InstallInitialize之后进行,则先完全删除以前的版本,然后安装新版本。这会导致不必要的文件删除和重新复制。

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

        5
  •  16
  •   Cœur N0mi    5 年前

    WiX-users mailing list .

    WiX最好是在对Windows Installer的工作有充分了解的情况下使用。你可能会考虑得到“ The Definitive Guide to Windows Installer

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

    RemoveExistingProducts 过程 <Upgrade> @Id UpgradeCode (详情请参阅 <Product> 系统上所有已安装产品的。这个 升级码 UpgradeVersion/@OnlyDetect 属性是 no (或省略),将被删除。

    删除现有产品 提到设置 UPGRADINGPRODUCTCODE 所有物这意味着卸载过程 对于要移除的产品 Product/@Id

    如果您的原始安装不包括 升级码 ,您将无法使用此功能。

        6
  •  11
  •   Rob W jminkler    12 年前

    我使用此网站帮助我了解WiX升级的基本知识:

    http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

    正如Mike在Apress的书《Windows Installer的最终指南》中所说,它将帮助您理解,但它不是用WiX编写的。

    http://www.wixwiki.com/index.php?title=Main_Page

        7
  •  10
  •   Marek R    5 年前

    我读了报纸 WiX

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

    但是 主要原因 问题的关键是文档中说要使用“ 重新安装=全部重新安装模式=vomus “小升级和小升级的参数,但并没有说这些参数是 -他们干脆停止工作。所以你不应该在重大升级时使用它们。

        8
  •  7
  •   Dhaust    15 年前

    我建议看一看Alex Shevchuk的教程。他通过WiX解释了“重大升级”,并在 From MSI to WiX, Part 8 - Major Upgrade .

        9
  •  7
  •   Daniel Morritt    14 年前

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

    * 小更新

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

    表示从一个完整版本到另一个完整版本的重大更改。更改所有内容:版本属性、产品和包GUID。

        10
  •  5
  •   Merill Fernando    14 年前

    <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应与您在产品的UpgradeCode属性中定义的GUID相同。

        11
  •  3
  •   zed    8 年前

    <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匹配。

        12
  •  1
  •   Gian Marco    10 年前

    这对我来说很有用,即使是对梅杰来说 向下

    <Wix ...>
      <Product ...>
        <Property Id="REINSTALLMODE" Value="amus" />
        <MajorUpgrade AllowDowngrades="yes" />