Wix Burn,我如何允许降级?

Posted

技术标签:

【中文标题】Wix Burn,我如何允许降级?【英文标题】:Wix Burn, how do I allow downgrading? 【发布时间】:2014-05-12 16:47:48 【问题描述】:

所以我有一个非常简单的刻录安装程序,主要用于包括 .net 升级或偶尔为我们的应用需要与之通信的硬件提供驱动程序包。

我们创建的 MSI 支持升级或降级。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"       
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
    <Bundle Name="My App Name" Manufacturer="Company Name" Version="!(bind.packageVersion.MyAPP_MSI)"
            IconSourceFile="MyIcon.ico"  DisableModify="yes" DisableRemove="yes"
            UpgradeCode="15E598EF-89CE-470B-8CEF-E32C8983DA33" >
        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" >
            <bal:WixStandardBootstrapperApplication
                LogoFile="$(var.CoreComponents.TargetDir)InstallerGraphics\Bootstrapper_Logo.png"
                LicenseFile="$(var.CoreComponents.TargetDir)AppRoot\App License.rtf" 
                SuppressOptionsUI="yes" />
        </BootstrapperApplicationRef>

        <Chain>
            <PackageGroupRef Id="NetFx451Web"/>

            <MsiPackage DisplayName="My full Application Name"  Id="MyAPP_MSI" SourceFile="$(var.Installer_MyAppMSI_TargetPath)"
                        DisplayInternalUI="yes" ForcePerMachine="yes" Visible="yes" />

        <MsiPackage DisplayName="My Hardware Driver" Id="Installer_MSI_Driver" SourceFile="$(var.Installer_Driver.TargetPath)"
                    DisplayInternalUI="yes" ForcePerMachine="yes" Visible="yes" />

        </Chain>
    </Bundle>
</Wix>

我们通常有 beta 版本,当用户想要从 beta 降级到我们的稳定版本时,他们不能简单地执行旧的 EXE 安装程序。他们必须从“添加/删除程序”中明确删除以前的软件包才能安装较旧的 Burn EXE。

这不是基于 MSI 的安装的问题。我们如何恢复该功能?

日志

[0CB8:067C][2014-06-23T11:10:04]i001: Burn v3.8.1128.0, Windows v6.1(Build 7601: Service Pack 1), path:\\iop-filesvr\IOP\Builds\Main\8.1.240\IO Practiceware Client Setup.exe, cmdline: '-burn.unelevated BurnPipe.197B8193-6EFC-4ED0-AF90-DE7205F13E65 CD23A8AB-520B-4F5D-BCB9-98998C5A1EC0 2216'

[0CB8:067C][2014-06-23T11:10:04]i000: Setting string variable 'WixBundleLog' to value 'C:\Users\jeff\AppData\Local\Temp\IO_Practiceware_Client_8.1.240.0_20140623111004.log'

[0CB8:067C][2014-06-23T11:10:04]i000: Setting string variable'WixBundleOriginalSource' to value '\\iop-filesvr\IOP\Builds\Main\8.1.240\IO Practiceware ClientSetup.exe' 

[0CB8:067C][2014-06-23T11:10:04]i000: Setting string variable 'WixBundleName' to value 'IO Practiceware Client 8.1.240.0'

[0CB8:067C][2014-06-23T11:10:05]i100: Detect begin, 2 packages

[0CB8:067C][2014-06-23T11:10:05]i000: Setting string variable 'PrerequisitesVersion' to value '1.0.0.0'

[0CB8:067C][2014-06-23T11:10:05]i102: Detected related bundle: 8d398d25-606f-419a-9b29-e3434aeb2485, type: Upgrade, scope: PerUser, version: 8.1.241.0, operation: Downgrade

[0CB8:067C][2014-06-23T11:10:05]i103: Detected related package: 7EA877FF-CE7A-49CE-8F76-D5A11EA7DD7A, scope: PerMachine, version: 1.0.0.0, language: 0 operation: MajorUpgrade 

[0CB8:067C][2014-06-23T11:10:05]i103: Detected related package: 8E8A7689-FB1C-4FE5-AF7C-95D499A342DE, scope: PerUser, version: 8.1.241.0, language: 0 operation: MajorUpgrade 

[0CB8:067C][2014-06-23T11:10:05]i101: Detected package: PrerequisitesMsi, state: Absent, cached: None

[0CB8:067C][2014-06-23T11:10:05]i101: Detected package: ClientMsi, state: Absent, cached: None 

[0CB8:067C][2014-06-23T11:10:05]i199:Detect complete, result: 0x0 

[0CB8:076C][2014-06-23T11:10:16]i000: Setting numeric variable 'EulaAcceptCheckbox' to value 0

[0CB8:076C][2014-06-23T11:10:16]e000: Error 0x80070666: Cannot install a product when a newer version is installed.

【问题讨论】:

那么当您运行旧的刻录 exe 安装程序时会发生什么?理想情况下,刻录处理刻录级别和 MSI 级别的升级。因此,如果 MSI 设置为降级,它应该会发生。如果没有发生,能否请您粘贴刻录安装/卸载日志? 您说“从测试版降级回我们的稳定版”。我们将稳定版本视为测试版的升级。例如Beta 1.2.3.1234 被用户视为“1.2.3.1234”。以下版本是 1.2.3.1235,但用户将其视为“1.2”。 Wix 使用的版本号可能与用户用户看到的版本不同。例如参考版。 【参考方案1】:

这对我有用:

<MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="yes"  />

见WIX docs on MajorUpgrade Element。

【讨论】:

这不适用于捆绑包,仅适用于产品。 (问题是关于捆绑) 它对我有用,但它会在升级时删除所有用户文件。 @Contango 你把这个元素放在 BootStrapper 的什么位置? @tcables 尝试searchcode.com 以获取上下文中的使用示例,例如搜索“afterInstallInitialize”,按WiX source过滤。【参考方案2】:

尝试在您的 product.wxs 文件中添加&lt;Property Id="REINSTALLMODE" Value="amus" /&gt;。 REINSTALLMODE 属性是一组设置,用于定义具有不同/相同版本的新安装的行为。更多详情可以查看REINSTALLMODE property作为参考。

【讨论】:

尝试添加此属性,但它仍然不会让我降级版本。请参阅我的答案以了解对我有用的东西。 +1。绝对看起来是一个更好的解决方案。但这对我有用,因为我启用了 msi 重写所有注册表并通过设置此属性再次复制文件。会尝试您提供的解决方案。如果对我有用,我会添加 cmets。 我必须将这个和 Contango 的答案结合起来才能让它发挥作用。【参考方案3】:

将测试版视为导致稳定(RC 或市场)版本的版本。文件/程序集版本总是向上移动,因此安装是升级。

采取以下发布顺序:

1.2.3.4567 测试版 1.2.3.4568 市场发布 1.2.4.4569 下一个测试版

根据市场(稳定)版本还是测试版来定义客户看到的版本。

查看“AssemblyInformationalVersion”。

[assembly: AssemblyVersion("1.0.0.1234")]
[assembly: AssemblyFileVersion("1.0.0.1234")]
[assembly: AssemblyInformationalVersion("1.0")]

始终升级。

【讨论】:

是的,这正是它的工作原理。问题是,当 1.2.4.4569 有缺陷并且人们想要回滚到 1.2.3.4568 时,他们不能简单地运行旧的安装程序。使用 msi,他们可以做到这一点,并且会成功。 回滚到测试版还是回滚到之前的市场版本?回滚到测试版应该需要卸载/重新安装,更大的问题在起作用。之前的市场版本应该增加主要版本号以允许独立的多个版本安装......但这也需要您的应用使用单独的应用数据文件夹等。 我认为您对软件如何部署的想法与我的想法不一致。我们每 3-4 周发布一次测试版软件,每 4-6 个月发布一次正式版。这些不是重大修订,让它们并排安装是没有意义的。他们正在就地升级。可以通过 MSI 从本周的新测试版回滚到上个月的正式版本,但不能通过刻录。 MSI 进行卸载,然后放置新版本。在我们改为刻录之前,它运行良好。 Burn 还做了其他几件好事,但它不能处理这些事情真是太糟糕了。

以上是关于Wix Burn,我如何允许降级?的主要内容,如果未能解决你的问题,请参考以下文章

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面

如何将文件添加到 WiX Burn 中的 Container 元素?

WiX Burn:如何将安装程序可执行文件部署到某个位置?

强制 WiX Burn 引导程序允许 MSI 文件使用 REINSTALLMODE=amus

自定义 WiX Burn 引导程序用户界面?

如何获得 Wix Burn 捆绑包以阻止升级