我的WiX安装程序(WiX3.10,MSI4.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.1.1,最后的写入时间是2015-09-14。
现在我遇到了一个相关的问题,就像Robbie在这里所做的那样:wix major upgrade not installing all files:当我安装新的msi包并执行主要升级时,当前的nlog.dll (根据其文件版本更新,但根据其文件日期和产品版本更老)正在被删除,但是新的nlog.dll没有安装。
但是,按照建议使用Schedule="afterInstallExecute"或Schedule="afterInstallFinalize"对我没有好处。它不会像Robbie那样删除较新的文件而不安装旧的文件,它不会覆盖当前的文件,而只是将其保留在原来的位置。
长话短说,我希望我的安装程序能够简单地安装它附带的所有文件,而不考虑任何文件/产品/程序集版本控制。在一些有效的情况下,希望用旧文件替换较新的文件。你不能告诉安装引擎忽略文件版本/日期吗?如果没有,我有什么选择?
发布于 2015-09-16 11:21:54
可以将REINSTALLMODE属性设置为OMUS而不是OMUS。这将影响到全球所有组件。
另一个诀窍是使用“版本说谎”。这是您用更高版本编写文件元素的地方。使用热会使这很困难,因为现在必须在编译XML之前对其进行转换。
当然,真正的解决方案是击中nlog团队的头部。但根据我多年来从他们身上看到的,这是永远不会发生的。也许您只是使用一个资源编辑器来破解DLL并“修复”版本#。那是假设你不需要它强大的名字。不过,这感觉很肮脏,可能是CM的噩梦。
或者直接扔掉nlog。:)
发布于 2015-09-16 17:54:41
如果这是一次重大升级,并且希望在安装新产品之前卸载所有内容,那么您将RemoveExistingProducts排在InstallInitialize或InstallValidate之后。它首先进行卸载。
我不知道你是不是收到了“不允许安装.”发出或不发出,但是如果是,而且还有Dll的其他客户端(它与其他已安装的产品共享),那么我将查看该Dll是否支持私有副本,以便您可以为您的产品拥有自己的私有副本。如果它与其他产品共享,我不会使用说谎版本--我会用Visual打开Dll“打开为文件”并更改版本!让它成为您最新的共享版本,所以每个安装它的包都可以使用它。
如果它不是与其他产品共享的,而且您只是遇到了MSI的怪癖,那么在RemoveExistingProducts之前设置您自己的升级元素并调度它,这就是决定不安装的原因。这是可行的,但它是在MigrateFeatureStates之前,所以您将失去在您的主要升级功能迁移。
https://stackoverflow.com/questions/32603333
复制相似问题