wix - 安装后删除有效负载的替换 MSI 的 WiX 捆绑包
问题描述
概括
我有一个正在删除升级文件的捆绑包。它正在删除它们,因为旧的 MSI 卸载在新的 MSI 安装完成后触发。
由于它们具有具有不同组件 ID 的相同文件,因此引用计数无法阻止它。
我需要确保文件在安装过程结束时存在。
历史
捆绑 mk 1
创建了具有多个 MSI 的两个捆绑包。他们共享一些 MSI,但也有自己独特的内容。
- 从 mk1 升级到 mk1 对两个捆绑包都很好
捆绑 mk 2
其中一个捆绑包已更改为具有一些替换 MSI。它不再有任何共享的 MSI。新的 MSI 具有与以前相同的有效负载和相同的功能 ID,但具有不同的升级代码和组件 ID。
- 从 mk1 升级 -> mk2 仅适用于未更改的捆绑包。
- 从 mk2 升级 -> mk2 对这两个捆绑包都很好。
- 从 mk1 -> mk2 升级会导致更改后的捆绑包丢失有效负载。
- 修复将恢复文件。
- 日志文件显示 mk1 缓存的 MSI 卸载是在 mk2 MSI 安装后触发的,这就是删除所有文件的原因。
问题
丢失的文件显然是从 mk1 到 mk2 的问题。如果客户从 mk1 升级到 mk2,要求客户进行维修是不切实际的。
我最初尝试将这些功能强制到本地,直到我找到卸载日志文件并发现 MSI 已经安装正常 - 只是清理出现在一个意想不到的地方。
我希望我可以更改捆绑包的顺序,但它似乎没有任何自己的安装执行顺序可以调整。
我可以检测到捆绑包何时从 mk1 转到 mk2 并尝试更改内容,但我不知道要更改什么。
也许我需要检测缓存的包并针对它执行命令行卸载?
我不希望将自定义操作放入 MSI,但如果这是解决方法,我会这样做。我希望它可以从捆绑包中修复。
考虑的选项
- 如果它是从 mk1 到 mk2 的升级,则让包显式执行命令行卸载先前的包。
- 为新的 MSI 分配新的功能 ID 并包含 mk1 MSI 的 RTM,强制 mk1 MSI 功能状态为“不存在”并确保 mk2 MSI 在 mk1 MSI 之后运行。
- 通过使用修复选项调用自身,在捆绑安装结束时强制修复。
实施
添加我已经制定出来的东西会起作用。它带有自己要解决的一系列新问题。
我在 DetectRelatedBundle 中获得了有关缓存包的信息。从那里我可以在以下位置之一查找注册表:
HLKM:Software\Microsoft\Windows\CurrentVersion\Uninstall\<ProductCode>
HLKM:Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<ProductCode>
这给了我缓存包在InstallSource
注册表项中的位置。
在 PlanComplete 期间,我会使用缓存包的静默修改功能,告诉它删除共享功能,以便在新包将新文件放置到位之前将它们删除。
新的问题是:
- 这些功能不能很好地迁移。它仅安装先前选择的功能,但修改和卸载相信所有功能都存在。
- 如果出错,则无法回滚。
- 我不知道如果我从命令行静默升级运行 unlevated 会发生什么。这里的潜在问题。
解决方案
推荐阅读
- c++ - 减法倒计时到零游戏模式与C++中的递归
- r - 通过 R 中的嵌套函数传递默认参数
- c - C - 有效日期证书测试中的 Seg 错误
- c# - BLE 服务 UUID--System.FormatException:'Guid 应包含 32 位数字和 4 个破折号(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。
- javascript - 尝试通过 AJAX 验证 Laravel 表单时出现错误 422
- c# - c# 程序集没有在 Visual Studio 中引用相同的代码?
- angular - 在 gulp 任务中运行时,ng serve 挂起 69%
- java - Web 应用程序转换为 Maven 构建问题
- r - 用 sf 在 R 中绘制点和多面体对象
- vuejs2 - 如果内容是视频,Vue 真棒 swiper 播放视频