Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WiX:升级时替换子目录_Wix - Fatal编程技术网

WiX:升级时替换子目录

WiX:升级时替换子目录,wix,Wix,我正在使用WiX安装一些程序v1.0,它自带了自己的JRE 8.x,位于子目录JRE/中。现在我正在将我的程序升级到1.1版,它基于11.xJRE。我的MajorUpgrade是 <MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed."/> jre32.wxi是一个相当长的、自动生成的类似于 &

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

<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>
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'>
      <!-- ... -->


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

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

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


另请参阅的文档。

我想我已经找到了它,这多亏了@tom blodget:我将JRE文件夹作为一组
目录和
组件
/
文件
文件
有一个
Guid
,这是固定的(我需要它们在我们的构建系统中是可复制的,以允许引用它们)。我没有为新的JRE文件夹m更新它们(现在我更新了,而且我将JRE文件夹(旧文件夹和新文件夹)安装到不同的目标文件夹(我最初的问题中的选项#3)。再次感谢!

Windows Installer安装/删除组件。目录不能是组件。通常,每个文件都是一个单独的组件。Windows Installer选择要安装/删除的组件,并选择该组件所属的所有产品的哪些功能进行安装/删除/保留。那么,您是如何组织此组件的是针对已经发布的安装程序版本的吗?正是这样,请参见更新2:作为组件列表(和目录,在一个大的包含中),感谢tipp。我宁愿将其保留为
afterInstallValidate
(请参见更新1),因为我想保留多个文件,这些文件在=“卸载”时被删除–此属性似乎在更新时也会触发,并且只允许
Install
Uninstall`或
两者
,因此我无法使用更复杂的逻辑跳过删除。但是,如果没有其他解决方案,这是一个有效的回退,再次感谢!
<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'>
      <!-- ... -->