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服务?