Wix 重大升级,无论更新的文件版本如何都替换文件

Wix major upgrade, replace files regardless of newer file version

我的 WiX 安装程序(Wix 3.10、MSI 4.5)使用 MajorUpgrade 进行更新。要安装的文件是在预构建中使用 heat.exe 收集的。当前(较旧的)msi 文件包含文件 nlog.dll(随 NuGet 程序包 v4.1.0 一起提供),文件版本为 4.1.0.0,产品版本为 4.1.0,并且2015-09-01.

的最后写入时间

由于 nlog 团队 运行 遇到了一些严重的命名问题,他们发布了一个更新的 NuGet 包 v4.1.1,其中包含一个更新的 nlog.dll ,其文件版本已降低回到 4.0.0.0 而其产品版本已增加到 4.1.1,最后写入时间是 2015-09-14.

现在我 运行 遇到了 Robbie 在此处所做的相关问题:wix major upgrade not installing all files:当我安装新的 msi 软件包并执行主要升级时,当前 nlog.dll (根据其文件版本较新,但根据其文件日期和产品版本较旧)正在删除,但未安装新的 nlog.dll

但是,按照建议使用 Schedule="afterInstallExecute"Schedule="afterInstallFinalize" 对我来说不起作用。不像 Robbie 那样删除较新的文件而不安装较旧的文件,它不会覆盖当前文件,只是将其保留在原位。

长话短说,我希望我的安装程序只安装它附带的所有文件,而不考虑任何 file/product/assembly 版本控制的东西。在某些情况下,需要用旧文件替换新文件。不能告诉安装程序引擎忽略文件 versions/dates 吗?如果没有,我有什么选择?

您可以将 REINSTALLMODE 属性 设置为 AMUS 而不是 OMUS。这将影响全局所有组件。

另一个技巧是使用"version lying"。这是您使用更高版本编写文件元素的地方。使用热量会使这变得困难,因为现在您必须在编译之前转换 XML。

当然真正的解决办法是打nlog团队的头。但根据我多年来从他们那里看到的情况,这永远不会发生。也许您只是使用资源编辑器破解 DLL 和 'fix' 版本号。那是假设您不需要强命名。不过,这对我来说感觉很脏,而且可能是 CM 的噩梦。

或者直接转储nlog。 :)

如果这是一次重大升级并且您希望在安装新产品之前卸载所有内容,那么您可以在 InstallInitialize 或 InstallValidate 之后安排 RemoveExistingProducts。那先卸载。

我不知道你是否遇到了 "disallowing install..." 问题,但如果你遇到了,并且 Dll 有其他客户端(它与其他已安装的产品共享),那么我会查看该 DLL 是否支持私人副本,以便您可以为您的产品拥有自己的私人副本。如果它与其他产品共享,我不会使用版本说谎 - 我会用 Visual Studio "open as file" 打开 Dll 并更改版本!将其设为最新的共享版本,以便安装它的每个软件包都可以使用它。

如果它没有与其他产品共享,而您只是 运行 遇到 MSI 怪癖,那么制作您自己的升级元素并在 CostInitialize 之前安排 RemoveExistingProducts,这是决定不安装的原因。这行得通,但它在 MigrateFeatureStates 之前,因此您将在主要升级中失去功能迁移。