WiX:升级时替换子目录

时间:2019-04-17 11:57:45

标签: wix

我正在使用WiX安装一些程序v1.0,该程序带有自己的JRE 8.x,位于子目录jre/中。现在,我将程序升级到基于11.x JRE的1.1版。我的MajorUpgrade

<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>
  

更新1:,我想保留afterInstallExecute,因为有一个   我想保留几个文件。

那么,完全替换该/任何子目录的WiX方法是什么?

  • 我试图仅用JRE 11替换JRE8。结果证明这将现有文件保留在原处,尤其是jre/lib/ext/。但是,当将JRE从v9以下更新到v9 + requires that folder not to exist时,JVM拒绝在升级后启动
  • 所以我尝试用jre/source)标记RemoveFile ... On='install'-sub dir中的所有文件,希望安装新文件会删除旧文件,但这没用
  • 最后改为重用jre/,我将所有JRE 8文件放在子目录jre-8u181/中,并将JRE 11文件放在jre-11.0.2_7/中,希望WiX能够识别“哦,我不需要子目录{ {1}},因此我可以将其删除”。也不起作用。
  

更新2:通过以下方式包含JRE文件夹

jre-8u181/
     

jre32.wxi是一个相当长的,自动生成的列表,例如

<Directory Id='foo_jre_32' Name='jre'>
  <?include jre32.wxi ?>
</Directory>

2 个答案:

答案 0 :(得分:1)

将属性更改为Schedule="afterInstallValidate"(或删除属性,因为这是默认设置)。

这将导致Windows Installer在安装产品的新版本之前完全删除现有版本。现在,您只需删除新版本中的文件夹即可删除它。

我通常建议采用这种“重大升级”计划。它使您无忧无虑,因为新版本的安装将始终以“全新”方式启动,而不会保留旧版本(除非存在用户修改的文件)。当然,这会比Schedule="afterInstallExecute"慢一些,但是正确的安装比快2秒的安装更为重要。

另请参阅MajorUpgrade element的文档。

答案 1 :(得分:0)

由于@ tom-blodget,我想找到了它:我将JRE文件夹作为一组DirectoryComponent / File包含在内。 File有一个Guid,它是固定的(我需要它们在我们的构建系统中可复制,以允许对其进行引用)。我没有为新的JRE文件夹m更新它们(现在我做了,再加上将JRE文件夹(旧的和新的)安装到不同的目标文件夹(我的第一个问题中的选项#3)。再次感谢!