Wix主要升级,无论新文件版本如何都替换文件

时间:2015-09-16 08:26:52

标签: wix windows-installer major-upgrade

我的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 < / strong>虽然其产品版本已增加到4.1.1,但上次写入时间为2015-09-14

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

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

长话短说,我希望我的安装程序只需安装随附的所有文件,无论文件/产品/程序集版本是什么。在有效的情况下,需要用较旧的文件替换较新的文件。你不能告诉安装程序引擎忽略文件版本/日期吗?如果没有,我的选择是什么?

2 个答案:

答案 0 :(得分:7)

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

另一个技巧是使用&#34;版本说谎&#34;。这是您使用更高版本创建文件元素的位置。使用heat可能会使这很困难,因为现在你必须在编译之前转换XML。

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

或者只是转储nlog。 :)

答案 1 :(得分:0)

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

我无法判断您是否正在接受“禁止安装...”问题,但如果您是,并且还有其他客户端(它与其他已安装的产品共享)那么我会看看Dll是否支持私人副本,这样你就可以拥有自己的产品私人副本。如果它与其他产品共享我不会使用版本说谎 - 我将使用Visual Studio打开Dll“打开文件”并更改版本!制作最新的共享版本,因此安装它的每个软件包都可以使用它。

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