WiX:升级时替换子目录
WiX: Replace sub directory on upgrade
我正在使用 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."/>
Update 1: I'd like to keep afterInstallExecute
because there are a
couple of files I'd like to keep.
那么WiX如何完全替换that/any子目录呢?
- 我试图用 JRE 11 替换 JRE 8。事实证明这会保留现有文件,尤其是
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 能够识别 "oh, I do not need sub dir jre-8u181/
any longer, so I can delete it"。也不行。
Update 2: The JRE folder is included via
<Directory Id='foo_jre_32' Name='jre'>
<?include jre32.wxi ?>
</Directory>
with jre32.wxi being a rather long, auto-generated list like
<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'>
<!-- ... -->
将属性更改为 Schedule="afterInstallValidate"
(或删除该属性,因为这是默认设置)。
这会导致 Windows 安装程序在安装产品的新版本之前完全删除现有版本。您现在只需从新版本中省略即可删除该文件夹。
这个重大升级的时间安排是我总体上推荐的。它给你带来的麻烦最少,因为新版本安装总是会开始 "fresh",而不会保留旧版本(除非有用户修改的文件)。当然这会比 Schedule="afterInstallExecute"
慢一些,但是正确的安装比快 2 秒的安装更重要。
另请参阅 MajorUpgrade element 的文档。
我想我已经找到了,感谢@tom-blodget:我将 JRE 文件夹作为一组 Directory
和 Component
/File
包括在内。 File
有一个 Guid
,它是固定的(我需要它们在我们的构建系统中可重现以允许引用它们)。我没有为新的 JRE 文件夹更新它们 m(现在我更新了,而且我将 JRE 文件夹(旧的和新的)安装到不同的目标文件夹(我最初的问题中的选项 #3)。再次感谢!
我正在使用 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."/>
Update 1: I'd like to keep
afterInstallExecute
because there are a couple of files I'd like to keep.
那么WiX如何完全替换that/any子目录呢?
- 我试图用 JRE 11 替换 JRE 8。事实证明这会保留现有文件,尤其是
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 能够识别 "oh, I do not need sub dirjre-8u181/
any longer, so I can delete it"。也不行。
Update 2: The JRE folder is included via
<Directory Id='foo_jre_32' Name='jre'> <?include jre32.wxi ?> </Directory>
with jre32.wxi being a rather long, auto-generated list like
<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'> <!-- ... -->
将属性更改为 Schedule="afterInstallValidate"
(或删除该属性,因为这是默认设置)。
这会导致 Windows 安装程序在安装产品的新版本之前完全删除现有版本。您现在只需从新版本中省略即可删除该文件夹。
这个重大升级的时间安排是我总体上推荐的。它给你带来的麻烦最少,因为新版本安装总是会开始 "fresh",而不会保留旧版本(除非有用户修改的文件)。当然这会比 Schedule="afterInstallExecute"
慢一些,但是正确的安装比快 2 秒的安装更重要。
另请参阅 MajorUpgrade element 的文档。
我想我已经找到了,感谢@tom-blodget:我将 JRE 文件夹作为一组 Directory
和 Component
/File
包括在内。 File
有一个 Guid
,它是固定的(我需要它们在我们的构建系统中可重现以允许引用它们)。我没有为新的 JRE 文件夹更新它们 m(现在我更新了,而且我将 JRE 文件夹(旧的和新的)安装到不同的目标文件夹(我最初的问题中的选项 #3)。再次感谢!