Wix:禁止安装组件:因为存在具有更高版本密钥文件的相同组件

rin*_*rin 3 windows-installer wix wix3

在部署到生产环境之前,我正在OPS环境中对MSI进行兼容性检查.

我正在部署的第一部分是最新的MSI说"在MSIv1之上的MSIv2到OPS环境,MSIv2自动卸载MSIv1并安装MSIv2而没有任何问题.

现在,当我在MSIv2上安装MSIv1时.MSIv1已安装,它在安装的控制面板中显示.但是当我看到目录路径时,bin文件夹中没有.dll文件.

我正在日志文件中记录MSI的操作告诉...日志:不允许安装组件:{AC7BC9EB-4F1D-4FEE-B0C2-478966229D8E}因为存在具有更高版本密钥文件的相同组件

Isa*_*110 8

请原谅我的答案,但我认为了解基础知识非常重要:

您是否更改了2个MSI版本之间的产品代码?我的猜测是你没有更改两个版本之间的产品代码,Windows安装程序正在考虑将其作为次要升级.首先要了解Major vs Minor升级之间的区别.

次要升级

次要升级是对许多资源进行更改的更新.所有更改都不需要更改ProductCode.更新需要进行重大升级才能更改ProductCode.次要升级可用于添加新功能和组件,但无法重新组织功能组件树.次要升级可提供产品差异化,而无需实际定义不同的产品.典型的次要升级包括先前小型更新中的所有修复程序组合到修补程序中.次要升级通常也称为Service Pack(SP)更新.

重大升级

主要升级是需要更改ProductCode属性的产品的全面更新.典型的主要升级会删除以前版本的应用程序并安装新版本.主要升级可以重新组织功能组件树.在使用Windows Installer进行主要升级期间,安装程序会在用户的计算机上搜索与挂起升级相关的应用程序,并在检测到升级时,从系统注册表中检索已安装应用程序的版本.然后,安装程序使用升级数据库中的信息来确定是否升级已安装的应用程序.

现在,在次要升级期间,Windows安装程序使用以下规则替换现有文件 - 由于不必要的文件复制会减慢安装速度,因此Windows Installer会在尝试安装任何组件的文件之前确定是否已安装组件的密钥文件.如果安装程序找到与目标位置中安装的组件密钥文件同名的文件,则会比较两个密钥文件的版本,日期和语言,并使用文件版本控制规则来确定是否安装由包.如果安装程序确定需要替换密钥文件上的组件库,则它会使用每个已安装文件上的文件版本控制规则来确定是否替换该文件.

任何安装程序的核心都是文件的实际安装.确定是否安装文件是一个复杂的过程.在最高级别,此确定取决于文件所属的组件是否标记为安装.一旦确定应该复制文件,如果目标文件夹中存在具有相同名称的另一个文件,则该过程很复杂.在这种情况下,进行确定需要一组涉及以下属性的规则:

  1. 日期
  2. 语言

尝试将文件安装到已包含具有相同名称的文件的位置时,安装程​​序仅使用这些规则.在这种情况下,Windows Installer使用以下规则,所有其他条件相同,以确定是否安装.

最高版本胜出 - 所有其他条件相同,即使计算机上的文件具有最高版本,具有最高版本的文件也会获胜.

版本化文件Win-版本化文件安装在非版本化文件上.

偏好产品语言 - 如果要安装的文件的语言与计算机上的文件不同,请使用与所安装产品相匹配的语言来支持该文件.与语言无关的文件仅被视为另一种语言,因此正在安装的产品再次受到青睐.

多种语言不匹配 - 在计算出正在安装的文件与计算机上的文件之间的任何通用语言之后,根据所安装产品的需要,可以使用任何其他语言.

保留Superset语言 - 保留支持多种语言的文件,无论它是已在计算机上还是正在安装.

非版本化文件是用户数据 - 如果修改日期晚于计算机上文件的创建日期,请不要安装该文件,因为将删除用户自定义项.如果修改日期和创建日期相同,请安装该文件.如果创建日期晚于修改日期,则认为文件未修改,请安装该文件.

在次要升级期间,可以使用REINSTALLMODE属性覆盖或修改默认文件版本控制规则.安装,重新安装或修复文件时,安装程​​序使用REINSTALLMODE属性指定的文件版本控制规则.REINSTALLMODE属性的默认值是"omus".

现在您必须决定是要为MSI进行MinorUpgrade还是重大升级.如果是主要升级,则默认情况下会在安装新版本之前卸载旧版本的产品.使用下面的链接"WIX MAJOR UPGRADE"获取有关如何实现此功能的更多详细信息.您还可以在MajorUpgrade元素中设置以下属性 - 以确保您可以在新版本之上安装旧版本.

 AllowDowngrades    YesNoType   When set to no (the default), products with lower version numbers are blocked from installing when a product with a higher version is installed; 
 the DowngradeErrorMessage attribute must also be specified. When set to yes, any version can be installed over any other version.
Run Code Online (Sandbox Code Playgroud)

如果您坚持进行次要升级,则需要使用上面提到的REINSTALLMODE属性覆盖默认文件版本控制规则,并使用代码"d"

d   Reinstall if the file is missing or a different version is present.
Run Code Online (Sandbox Code Playgroud)

然后使用以下msiexec命令:

 msiexec.exe /i installer.msi REINSTALL=ALL REINSTALLMODE=vdmus
Run Code Online (Sandbox Code Playgroud)
  1. 少数升级
  2. 主要升级
  3. 少量升级 - 替换现有规则
  4. MINOR UPGRADE - 文件版本控制规则
  5. REINSTALLMODE
  6. WIX主要升级

希望有所帮助!


rin*_*rin 1

产品代码在wix中为“*”。MSI 从其中一个 exe 获取版本,该 exe 作为 msi 的一部分进行部署。安装 MSI 时,该 exe 会安装该服务。exe 已进行版本控制,因此 MSI 将具有相同的版本。因此,当安装较低版本的 MSI 时,exe 也将具有相同的版本,因此 exe 与服务器中已存在的 exe 进行比较,并决定不安装,因为较高版本已存在。

所以我所做的是“RemoveExistingproduct” before =“costing”

这解决了删除更高版本之前的产品的问题。

让我知道是否还有其他替代方案,这是否是正确的做法以及后果是什么。