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的主要内容,如果未能解决你的问题,请参考以下文章