【问题标题】:Wix installer can not upgrade InstallShield thingyWix 安装程序无法升级 InstallShield thingy
【发布时间】:2018-02-19 03:17:40
【问题描述】:

我有 InstallShield 产品 - setup.exe。这个setup.exe 实际上是某种引导程序,它安装了一个名为product.msi 的文件。我有这个 product.msi 东西的UpgradeCode。所以我应该可以用MajorUpgrade 元素制作一个Wix 安装程序。但是,它不起作用 - 并非所有文件都已安装。这是link to the log

以下是日志中的一些可疑行:

MSI (s) (2C:F4) [22:47:19:663]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2911 
DEBUG: Error 2911:  Could not remove the folder C:\Config.Msi\.
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2911. The arguments are: C:\Config.Msi\, , 
MSI (s) (2C:F4) [22:47:19:667]: Note: 1: 2318 2:  

以下是 wxs 文件的相关部分:

<Product Id="*" Codepage="1252" Language="1033" Manufacturer="Intel Corporation"
           Name="TenLira" UpgradeCode="$(var.UpgradeCode)" Version="$(var.Version)">

    <Package Comments="Contact: Refael Sheinker, refael.sheinker@intel.com." Description="TenLira"
             InstallerVersion="500"
             Compressed="yes"
             InstallPrivileges="elevated"
             InstallScope="perMachine"
             Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Intel Corporation" Platform="x64" />

    <Property Id="REINSTALLMODE" Value="amos" />
    <Property Id="REBOOT" Value="ReallySuppress" />

    <Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />

    <MajorUpgrade AllowDowngrades="no"
                  AllowSameVersionUpgrades="yes"
                  Disallow="no"
                  IgnoreRemoveFailure="no"
                  MigrateFeatures="yes"
                  Schedule="afterInstallFinalize"
                  DowngradeErrorMessage="A later version of [ProductName] is already installed" />

请指教。谢谢。雷法尔。

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    使用默认的 MajorUpgrade 元素配置时,您将默认在重大升级期间安装新版本之前完全卸载旧产品版本。 在技术方面RemoveExistingProduct 的位置在 InstallExecuteSequence 中发生变化(它从 InstallFinalize 之后移动到 InstallInitialize 之前) - 我验证了当您将 MajorUpgrade element 更改为其默认值时确实会发生这种情况,并且最简单的格式——就像你做的那样)。

    在重大升级期间尽早卸载将有助于消除由两个设置中的错误组件引用引起的任何错误。这种错误的组件引用通常会导致文件在升级后丢失,或者文件没有​​按预期被覆盖(后者是与影响文件版本控制规则的危险 REINSTALLMODE 设置有关的更大问题)。明天我会更新更多细节 - 我写了一个很长的答案,现在发布太乱了。

    郑重声明,您的 REINSTALLMODE (amos) 值似乎不是 REINSTALLMODE 的有效参数。有些人使用amus 来强制覆盖文件,但amos 只是不正确的参数(字母ao 有冲突——它们为同一事物定义了不同的行为)。使用amus 可能会导致一些非常不受欢迎的副作用,如果我有时间,我将在明天尝试解释。

    【讨论】:

    • 使用 amus 会导致许多非常不受欢迎的副作用 - 你吓到我了 :-) 这是唯一能解决我问题的方法。它会导致什么副作用?
    • 您的设置中是否有很多未版本控制的文件需要强制覆盖(代码示例文件、IIS ASP 文件等...)?或者您是否也需要降级二进制文件(dll、exe 等)?
    • Asmul,是的,我确实有很多版本文件(文档、文本文件、bmp 等等)。它们确实需要被覆盖,它们随着每个版本的变化而变化。我不需要降级二进制文件,也许在未来,我想放弃这种可能性。
    • Refael,抱歉,我仍在努力提供一个正确的答案,说明为什么 REINSTALLMODE="amus" 是一个危险的功能 - 我需要做一些测试以将事实与狂热分子分开(流行的错误事实是经常陈述,但未正确检查)。本质上,您可以降级系统范围的共享文件,通过不按顺序安装降级包(最后安装的旧包)导致共享二进制文件的版本不一致,进一步您可以清除用户更改的设置和数据文件,并且有其他问题也很少。我稍后会尝试写出来。
    【解决方案2】:

    好的,嗯...我不知道为什么,但是将MajorUpgrade 元素更改为以下内容:

    <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed" />
    

    解决问题。

    【讨论】:

    • Maybe try to compare the two resultant MSI files (before and after your change) using an appropriate tool 以查看文件中的实际不同之处?比较 MSI 文件就足够了,但您也可以使用 WiX 的dark.exe 对它们进行反编译,并确定存在哪些 WiX 源差异(两种方法都在链接的答案中进行了描述)。我会尽力追查到底,以确保问题得到真正解决 - 只需我的 2 美分。
    • 我不明白。要比较什么?我有两个 msi 文件的 wsx。唯一的区别是 MajorUpgrade 元素。我所做的改变。
    • 使用 SuperOrca 或 InstEd 或我之前评论中链接答案中列出的其他工具之一比较实际编译的 MSI 文件,您会发现 RemoveExistingProducts 已在 InstallInitialize 之前移动,正如我在我的答案。这极大地影响了重大升级的安装方式。看看我添加的答案是否有意义(答案,而不是评论)。关于 REINSTALLMODE 的更多信息,我稍后会与您联系。
    • 它现在很可能可以工作,因为主要升级的默认计划是 afterInstallValidate,所以现在首先卸载整个旧产品,然后安装升级。以前是afterInstallFinalize,和事务外完全不同。目前尚不清楚主要升级的要求是什么,但如果是先卸载所有旧设置,那么问题就解决了。 AfterInstallFinalize 几乎不是正确的地方。
    猜你喜欢
    • 2014-01-31
    • 2021-09-21
    • 1970-01-01
    • 2010-09-11
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多