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 之前,因此您将在主要升级中失去功能迁移。
我的 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 之前,因此您将在主要升级中失去功能迁移。