【问题标题】:WiX: Replace sub directory on upgradeWiX:升级时替换子目录
【发布时间】:2019-04-24 14:02:50
【问题描述】:

我正在使用 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 8 替换为 JRE 11。结果证明这会保留现有文件,尤其是 jre/lib/ext/。但是当将 JRE 从 v9 更新到 v9+ requires that folder not to exist 时,JVM 在升级后拒绝启动
  • 所以我尝试用RemoveFile ... On='install' (source) 标记jre/-sub 目录中的所有文件,希望安装新文件会删除旧文件,但这不起作用
  • 最后改为重用jre/,我将所有JRE 8 文件放在子目录jre-8u181/ 中,将JRE 11 文件放在jre-11.0.2_7/ 中,希望WiX 能够识别“哦,我不再需要子目录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='foo\jre\THIRDPARTYLICENSEREADME.txt' Name='THIRDPARTYLICENSEREADME.txt' DiskId='1' />
  </Component>
  <Component Id='_0dcaf4ce39ea5a8ab63704e6e8e23514' Guid='*'>
    <File Id='_9e93e8a3fced0b6549171fc677dad65c' Source='foo\jre\README.txt' Name='README.txt' DiskId='1' />
  </Component>
  <Component Id='_2fa36d02341dba40d7dd8dabc21aa506' Guid='*'>
    <File Id='_3654927acd82cae7b37fb9b7c92a6615' Source='foo\jre\release' Name='release' DiskId='1' />
  </Component>
    <Directory Id='_9b3d18d11d414dfb14909186a8ebb330' Name='lib'>
      <!-- ... -->

【问题讨论】:

  • Windows Installer 安装/删除组件。目录不能是组件。通常,每个文件都是一个单独的组件。 Windows Installer 选择要安装/删除的组件,选择该组件所属的所有产品的哪些功能进行安装/删除/保留。那么,对于已经发布的安装程序版本,您是如何组织的呢?
  • 正是这样,请参阅更新 2:作为组件列表(和目录,在一个大型包含中)

标签: wix


【解决方案1】:

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

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

我通常推荐这种主要升级计划。它给您带来最少的麻烦,因为新版本安装将始终“全新”启动,没有旧版本的残留物(除非有用户修改的文件)。当然这会比Schedule="afterInstallExecute" 慢一些,但正确的安装比快 2 秒的安装更重要。

另请参阅MajorUpgrade element 的文档。

【讨论】:

  • 感谢您的提示。我宁愿将其保留为 afterInstallValidate(请参阅更新 1),因为我想保留几个文件,这些文件将被删除 on="Uninstall" – seems this attribute is triggered even on update, and allows only Install, Uninstall` 或 both,所以我不能跳过删除有一些更复杂的逻辑。但是,如果没有其他解决方案,这是一个有效的后备方案,再次感谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2023-03-22
    • 2010-10-04
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多