首页 文章

如何防止Wix安装旧版本?

提问于
浏览
1

我有一个应用程序,我们正在切换到WiX安装程序 . 到目前为止,几乎所有事情似乎都进展顺利 . 我遇到的一个问题是,如果下载旧版本并试图安装,它就会这样做 .

这有点问题 . 如果安装了较新版本,我不希望它安装旧版本 . 我认为问题出在“升级”组件上,但我必须承认我遇到了问题 . 如何更改它以便旧版本看到已安装较新版本而不安装它?

我的测试产品现在是2.4版本(我们试图推出的最新版本) . 它正确升级到2.4.1或2.5或3.0 . 但是如果我制作3.0版本,然后运行msi for 2.4它仍会添加它 .

我的升级组件:

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion Maximum="2.4" Property="PREVIOUSVERSIONSINSTALLED" />
  <UpgradeVersion Minimum="1.0" Property="NEWERPRODUCTFOUND" OnlyDetect="yes" IncludeMinimum="no" />
</Upgrade>

跟进:
遵循Steins的建议后我得到了这样的错误
"Duplicate symbol 'WixAction:InstallExecuteSequence/RemoveExistingProducts' found"
<InstallExecuteSequence> 下的Product.wxs文件中查看后,我不得不删除 <RemoveExistingProducts Sequence="6550" /> ,因为那是它所指的副本 . 执行此操作后,安装程序工作,旧版本无法再安装在新版本之上 .

1 回答

  • 3

    Packages of Futures Past :您无法更改软件包的旧版本以检测更新版本 . 您需要从一开始就为您的包构建保护 . Packages need to be pre-cognitive. It's an industry problem.

    Modern Times :您在上面显示的WiX元素是"old-style" . 这里描述了一个新的"convenience feature": How do you detect installed product versions at each startup? 它涉及"new" MajorUpgrade element . 这个新的MajorUpgrade element具有一些自动魔法功能,我相信它会增加您默认描述的保护(降级保护) . 因此,您可以切换到使用它 . 我先尝试一下 . 让我列出基本标记:

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

    除了删除旧式升级元素外,还请记住删除 RemoveExistingProducts 标准操作的任何硬编码调度 . 例如,删除此行(序列号可能不同,但名称相同):

    <RemoveExistingProducts Sequence="6550" />
    

    Decoupling :如果您发现人们运行旧版本并且使用最新应用程序的风险很高,您可以为最新版本设置新的安装位置和新的升级代码并并排安装以解耦你的新旧产品 .

    Side-By-Side :为此,您的产品必须能够和平共存,而不是争夺文件关联,每台计算机注册的COM服务器或其他全局共享数据,这些数据会使产品相互干扰 . 这是否可行取决于您的应用 . 无法从两个不同的位置注册全局共享的COM服务器 - 如果您使用正常的注册表注册(您可以使用基于清单的无注册COM - 尽管有时会涉及这一点) . 在您的应用程序支持并行安装之前,可能需要克服许多挑战,或者如果您的软件包很简单而没有注册表参与,则可能相当简单 .

    Component GUIDs :除了提到的升级代码更改之外,您还需要为所有组件设置新的组件GUID,以便真正保护产品彼此之间的隔离 . 如果你使用WiX auto-GUIDs,这将自动神奇地发生 . 这里尝试解释了您需要新组件GUID的原因:Change my component GUID in wix?本质上,GUID引用计算绝对安装位置,而不是文件本身 . 您安装到新位置,需要一个新的组件GUID .

相关问题