Wix 重大升级,无论文件版本较新,都替换文件

Posted

技术标签:

【中文标题】Wix 重大升级,无论文件版本较新,都替换文件【英文标题】:Wix major upgrade, replace files regardless of newer file version 【发布时间】:2015-09-16 08:26:52 【问题描述】:

我的 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 那样删除较新的文件而不安装较旧的文件,而是不会覆盖当前文件,而是将其保留在原处。

长话短说,我希望我的安装程序能够简单地安装它附带的所有文件,而不考虑任何文件/产品/程序集版本控制内容。在某些情况下,需要用旧文件替换新文件。你不能告诉安装引擎忽略文件版本/日期吗?如果没有,我有什么选择?

【问题讨论】:

我们通过将所有应用程序安装在包含版本号作为路径的路径中来“修复”此问题。这样,应用程序的所有部分都将安装在新位置,因此不会出现这些问题。 Unity 3D 是另一个不关心正确版本化 dll 的违规者。 【参考方案1】:

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

另一个技巧是使用“版本谎言”。这是您使用更高版本创作文件元素的地方。使用热量会使这变得困难,因为现在您必须在编译 XML 之前对其进行转换。

当然,真正的解决方案是打击 nlog 团队。但根据我多年来从他们那里看到的情况,这永远不会发生。也许您只是使用资源编辑器来破解 DLL 并“修复”版本#。那是假设您不需要它的强命名。不过,这对我来说感觉很脏,可能是 CM 的噩梦。

或者只是转储 nlog。 :)

【讨论】:

<Product /> 节点内设置<Property Id="REINSTALLMODE" Value="amus" /> 确实有效。由于我没有安装任何可能会意外降级的共享组件(请参阅此处的 James 评论:***.com/a/6873475/2256445),我想我可以使用该解决方案。 我之前曾按照您的建议考虑过“版本谎言”,但由于您指出的原因,这不是一个可行的选择。转储 nlog 或修改 dll 是一个太窄的解决方案 imo,因为在其他类似情况下这可能不是一个选项。非常感谢您的意见。 就个人而言,我不喜欢热量,原因在此记录blog.iswix.com/2007/06/… 顺便说一句,我不认为它太狭隘了。我认为这是对不应该存在的问题的解决方案。其他人做错了事,现在它给你带来了不应该存在的问题。【参考方案2】:

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

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

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

【讨论】:

以上是关于Wix 重大升级,无论文件版本较新,都替换文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?

在wix中进行重大升级时如何只停止而不卸载Windows服务?

卸载升级时如何摆脱wix中未使用的dll

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

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

WIX:在单独的 cab 文件中升级未版本控制的文件