WiX:升级时替换子目录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WiX:升级时替换子目录相关的知识,希望对你有一定的参考价值。

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

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

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

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

  • 我试图用JRE 11替换JRE 8.结果这留下了现有的文件,特别是jre/lib/ext/。但是当将JRE从v9以下更新到v9 + requires that folder not to exist时,JVM在升级后拒绝启动
  • 所以我试图用jre/RemoveFile ... On='install')标记source-sub目录中的所有文件,希望安装新文件会删除旧文件,但这不起作用
  • 最后重新使用jre/我将所有JRE 8文件放在jre-8u181/的子目录jre-11.0.2_7/和JRE 11文件中,希望WiX识别“哦,我不再需要sub dir jre-8u181/,所以我可以删除它”。也不起作用。

更新2:通过包含JRE文件夹

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

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

<Include>
  <Component Id='_6387aee1c48be620fded05f509eb61ef' Guid='*'>
    <File Id='_e566fc2d9d74ea7a1249736056b2a2e4' Source='foojreTHIRDPARTYLICENSEREADME.txt' Name='THIRDPARTYLICENSEREADME.txt' DiskId='1' />
  </Component>
  <Component Id='_0dcaf4ce39ea5a8ab63704e6e8e23514' Guid='*'>
    <File Id='_9e93e8a3fced0b6549171fc677dad65c' Source='foojreREADME.txt' Name='README.txt' DiskId='1' />
  </Component>
  <Component Id='_2fa36d02341dba40d7dd8dabc21aa506' Guid='*'>
    <File Id='_3654927acd82cae7b37fb9b7c92a6615' Source='foojre
elease' Name='release' DiskId='1' />
  </Component>
    <Directory Id='_9b3d18d11d414dfb14909186a8ebb330' Name='lib'>
      <!-- ... -->
答案

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

这会导致Windows Installer在安装新版本的产品之前完全删除现有版本。您现在可以通过从新版本中省略该文件夹来删除该文件夹。

主要升级的这种安排是我一般建议的。它给您带来最少的麻烦,因为新版本安装将始终“新鲜”,没有旧版本(除非有用户修改的文件)。当然这将比Schedule="afterInstallExecute"慢一些,但正确的安装比2秒快的安装更重要。

另见MajorUpgrade element的文档。

另一答案

我想我找到了它,感谢@ tom-blodget:我将JRE文件夹包含为一组DirectoryComponent / FileFile有一个Guid,它是固定的(我需要它们可以在我们的构建系统中重现,以允许引用它们)。我没有为新的JRE文件夹m更新它们(现在我这样做,再加上我将JRE文件夹(新旧文件夹)安装到不同的目标文件夹(我最初的问题中的选项#3)。再次感谢!

以上是关于WiX:升级时替换子目录的主要内容,如果未能解决你的问题,请参考以下文章

卸载升级时如何摆脱wix中未使用的dll

Wix 重大升级,无论文件版本较新,都替换文件

如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?

WiX 安装程序在卸载时删除文件,但在升级时不删除

wix 生成新的升级代码

WiX 刻录包安装程序 - 升级安装时未更新 ExePackage