WiX 刻录包安装程序 - 升级安装时未更新 ExePackage

Posted

技术标签:

【中文标题】WiX 刻录包安装程序 - 升级安装时未更新 ExePackage【英文标题】:WiX burn bundle installer - ExePackage not being updated on upgrade install 【发布时间】:2016-10-20 17:01:41 【问题描述】:

我正在开发一个安装 MSI 包和一些 .exe 包的 WiX 引导程序/捆绑安装程序。安装新包时,包安装程序需要能够升级其组件。最初我遇到了一个问题,即我的 ExePackage 组件在升级时被卸载,然后我了解到你可以通过在 ExePackage 元素中放置一个 dep:Provides 条目来避免这种情况。这解决了卸载升级问题,但现在我看到了一个问题,即 ExePackage 组件没有使用较新的捆绑安装程序进行升级。

我通过创建 2 个版本的捆绑安装程序对此进行了测试 - 一个带有 ExePackage 组件之一的较新版本。如果我安装较低版本的捆绑包,然后安装较新版本的捆绑包,似乎没有升级 - 它应该升级的一个 ExePackage 组件仍然是旧版本。但是,由 dep:Provides 元素创建的注册表项会使用新版本进行更新。然后,当我卸载捆绑包时,除了应该升级的 ExePackage 组件之外,所有内容都会被删除。

似乎缺少此场景和其他 WiX 场景的文档或示例。有人有这个场景的例子吗?

我的一个 ExePackage 元素看起来与此类似:

<ExePackage Id="BLAH_INSTALLER"
              SourceFile="$(var.SolutionDir)\InputBin\BlahSetup.exe"
              Compressed="yes"
              InstallCommand="/install /quiet"
              UninstallCommand="/uninstall /quiet"
              DetectCondition="BlahPresent"
              Cache="always" >
    <dep:Provides Key="Blah" Version="5.0.0.0" />
  </ExePackage>

我的 DetectCondition 逻辑是一个类似于下面的 FileSearch:

<util:FileSearch
  Id="Blah_Installed"
  Path="[ProgramFiles64Folder]\blah\blah.exe"
  Variable="BlahPresent"
  Result="version" />

【问题讨论】:

【参考方案1】:

当安装该软件包的确切版本时,您的检测条件必须为真,否则为假。所以它可能需要类似于BlahPresent = v5.0.0.0 而不仅仅是BlahPresent(即使安装了不同的版本也是如此)。

【讨论】:

【参考方案2】:

似乎DetectCondition 阻止了.exe 软件包的更新。但是,我添加DetectCondition 的原因是为了解决另一个问题:没有DetectCondition,捆绑安装程序将不会卸载.exe 软件包。所以看来我必须在一个问题或另一个问题之间做出选择 - 我不确定如何解决这两个问题。

【讨论】:

【参考方案3】:

我仍在努力支持使用 EXEPackage 进行升级,所以这是一项正在进行的工作:

一开始我没有找到 Provides 元素,因此决定在我的引导程序中管理我自己的注册表项。从我读到的内容来看,我在注册表中所做的与 Burn 处理 Provides 的方式类似。

BootstrapperApplication 有一个 Guid 作为其构建 ID。构建 ID 对于每个构建都是新的。安装时,引导程序会在注册表中为每个包创建一个 PackageID-BuildID 对(MSI 包不需要这个,但也有条目也没有什么坏处)。

在调用 Engine.Detect() 之前,我的引导程序会在注册表中进行自己的检测,并将每个 EXE 包的单个真/假字符串变量作为其 DetectCondition 传递。仅当注册表中存在完全相同的构建 ID 时,DetectionCondition 才为真(即现有的过时包不计为现有包)。 如果引导程序有升级,则禁用删除包,因为引导程序无法区分同一 EXE 包的不同版本。否则,引导程序会认为它是旧版本而将其删除。

由于您没有提到任何有关自定义引导程序的内容,因此我假设您没有编写任何内容。我想您可以在 WXS 文件中类似地操作注册表并将条目与您的 DetectCondition 相关联。

我还没有解决的问题是在升级过程中删除了一个 EXE 包。我们的引导程序有一个包选择页面,类似于 MSI 中的功能选择。用户应该能够通过取消选择删除旧包而不安装新版本。我的引导程序不会卸载该软件包,因为它认为它不存在。

抱歉,答案很长。如果仍然感到困惑,很高兴在 cmets 中聊天。

【讨论】:

以上是关于WiX 刻录包安装程序 - 升级安装时未更新 ExePackage的主要内容,如果未能解决你的问题,请参考以下文章

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

wix 刻录安装程序要求

Wix Burn,我如何允许降级?

如何在升级过程中运行捆绑包时,如何在WIX(Windows安装程序xml)引导程序项目中将按钮文本更改为“升级”?

回滚到以前版本的 WiX 捆绑安装程序

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