Wix:Disallowing 安装组件:因为存在具有更高版本密钥文件的相同组件
Wix:Disallowing installation of component: since the same component with higher versioned keyfile exists
在部署到生产环境之前,我正在 OPS 环境中对 MSI 进行兼容性检查。
其中一部分我首先部署最新的 MSI 说“MSIv2 到 MSIv1 之上的 OPS 环境,MSIv2 会自动卸载 MSIv1 并安装 MSIv2,没有任何问题。
现在,当我在 MSIv2 之上安装 MSIv1 时。 MSIv1 已安装,当我看到目录路径时,它在控制面板中显示为 installed.But bin 文件夹中没有 .dll 文件。
我正在日志文件中记录 MSI 的操作,它告诉...
日志:
不允许安装组件:{AC7BC9EB-4F1D-4FEE-B0C2-478966229D8E},因为存在具有更高版本密钥文件的相同组件
请原谅我的冗长回答,但我认为了解基础知识很重要:
您是否更改了两个 MSI 版本之间的产品代码?我的猜测是您没有更改两个版本之间的产品代码并且 windows 安装程序正在考虑
这是一个小升级。首先了解Major vs Minor升级的区别。
小升级
次要升级是对许多资源进行更改的更新。 None 的更改可能需要更改 ProductCode。更新需要重大升级才能更改
产品代码。小升级可用于添加新功能和组件,但不能重新组织功能组件树。小幅升级提供产品差异化
而无需实际定义不同的产品。典型的次要升级包括将以前的小更新中的所有修复组合到一个补丁中。小升级也很常见
称为服务包 (SP) 更新。
重大升级
重大升级是对产品的全面更新,需要更改 ProductCode 属性。典型的重大升级会删除应用程序的先前版本
并安装新版本。重大升级可以重新组织功能组件树。在使用 Windows 安装程序进行重大升级期间,安装程序会搜索用户的
计算机查找与待定升级相关的应用程序,当它检测到一个应用程序时,它会从系统注册表中检索已安装应用程序的版本。
然后安装程序使用升级数据库中的信息来确定是否升级已安装的应用程序。
现在在次要升级期间 windows 安装程序使用以下规则替换现有文件 - 因为不必要的文件复制会减慢安装速度,所以 Windows 安装程序会在尝试之前确定组件的密钥文件是否已经安装到
安装任何组件的文件。如果安装程序在目标位置找到与安装的组件密钥文件同名的文件,它会比较版本、日期、
和语言这两个关键文件,并使用文件版本控制规则来确定是否安装软件包提供的组件。如果安装程序确定需要
根据密钥文件替换组件,然后它使用每个已安装文件的文件版本控制规则来确定是否替换文件。
任何安装程序的核心都是文件的实际安装。确定是否安装文件是一个复杂的过程。在最高级别,这一决定取决于
文件所属的组件是否标记为安装。一旦确定要复制一个文件,如果另一个文件具有相同的过程,过程会很复杂
名称存在于目标文件夹中。在这种情况下,做出决定需要一组涉及以下属性的规则:
- 版本
- 日期
- 语言
安装程序仅在尝试将文件安装到已包含同名文件的位置时使用这些规则。在这种情况下,Windows 安装程序使用
以下规则,在其他条件相同的情况下,判断是否安装。
最高版本获胜——在所有其他条件相同的情况下,最高版本的文件获胜,即使计算机上的文件具有最高版本也是如此。
版本化文件 Win - 版本化文件安装在非版本化文件之上。
支持产品语言—如果正在安装的文件与计算机上的文件的语言不同,则支持使用与正在安装的产品相匹配的语言的文件
安装。语言中性文件被视为另一种语言,因此正在安装的产品再次受到青睐。
多种语言不匹配—排除正在安装的文件和计算机上的文件之间的任何共同语言后,根据
正在安装的产品需要什么。
Preserve Superset Languages—保留支持多种语言的文件,无论它是否已在计算机上或正在安装。
非版本化文件是用户数据—如果修改日期晚于文件在计算机上的创建日期,请不要安装该文件,因为用户自定义会
删除。如果修改日期和创建日期相同,请安装该文件。如果创建日期晚于修改日期,则认为文件未修改,安装文件。
在次要升级期间,可以使用 REINSTALLMODE 属性 覆盖或修改默认文件版本控制规则。安装程序使用由
REINSTALLMODE 属性 在安装、重新安装或修复文件时。 REINSTALLMODE 的默认值 属性 是 "omus".
现在您必须决定是要为您的 MSI 进行次要升级还是主要升级。如果是 Major Upgrade,则默认情况下会卸载旧版本的产品
在安装新版本之前。使用下面的 link "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.
如果您坚持进行小升级,那么您将需要使用上面提到的 REINSTALLMODE 属性 覆盖默认文件版本控制规则,并使用代码 "d"
d Reinstall if the file is missing or a different version is present.
然后使用以下 msiexec 命令:
msiexec.exe /i installer.msi REINSTALL=ALL REINSTALLMODE=vdmus
- MINOR UPGRADE
- MAJOR UPGRADE
- MINOR UPGRADE - Replace Existing Rules
- MINOR UPGRADE - File Versioning Rules
- REINSTALLMODE
- WIX MAJOR UPGRADE
希望对您有所帮助!
wix中产品代码为“*”。
MSI 从作为 msi 的一部分部署的 exe 之一获取版本。当 MSI 是 installed.exe 版本时,exe 安装服务,因此 MSI 将具有相同的版本。
因此,当安装低版本的MSI时,exe也将具有相同的版本,因此exe与服务器中已有的exe进行比较,并决定不安装,因为高版本已经存在。
所以我做的是"RemoveExistingproduct"之前="costing "
这解决了在更高版本之前删除产品的问题。
如果有任何其他选择,请告诉我,这是正确的做法吗?后果是什么。
在部署到生产环境之前,我正在 OPS 环境中对 MSI 进行兼容性检查。
其中一部分我首先部署最新的 MSI 说“MSIv2 到 MSIv1 之上的 OPS 环境,MSIv2 会自动卸载 MSIv1 并安装 MSIv2,没有任何问题。
现在,当我在 MSIv2 之上安装 MSIv1 时。 MSIv1 已安装,当我看到目录路径时,它在控制面板中显示为 installed.But bin 文件夹中没有 .dll 文件。
我正在日志文件中记录 MSI 的操作,它告诉... 日志: 不允许安装组件:{AC7BC9EB-4F1D-4FEE-B0C2-478966229D8E},因为存在具有更高版本密钥文件的相同组件
请原谅我的冗长回答,但我认为了解基础知识很重要:
您是否更改了两个 MSI 版本之间的产品代码?我的猜测是您没有更改两个版本之间的产品代码并且 windows 安装程序正在考虑 这是一个小升级。首先了解Major vs Minor升级的区别。
小升级
次要升级是对许多资源进行更改的更新。 None 的更改可能需要更改 ProductCode。更新需要重大升级才能更改 产品代码。小升级可用于添加新功能和组件,但不能重新组织功能组件树。小幅升级提供产品差异化 而无需实际定义不同的产品。典型的次要升级包括将以前的小更新中的所有修复组合到一个补丁中。小升级也很常见 称为服务包 (SP) 更新。
重大升级
重大升级是对产品的全面更新,需要更改 ProductCode 属性。典型的重大升级会删除应用程序的先前版本 并安装新版本。重大升级可以重新组织功能组件树。在使用 Windows 安装程序进行重大升级期间,安装程序会搜索用户的 计算机查找与待定升级相关的应用程序,当它检测到一个应用程序时,它会从系统注册表中检索已安装应用程序的版本。 然后安装程序使用升级数据库中的信息来确定是否升级已安装的应用程序。
现在在次要升级期间 windows 安装程序使用以下规则替换现有文件 - 因为不必要的文件复制会减慢安装速度,所以 Windows 安装程序会在尝试之前确定组件的密钥文件是否已经安装到 安装任何组件的文件。如果安装程序在目标位置找到与安装的组件密钥文件同名的文件,它会比较版本、日期、 和语言这两个关键文件,并使用文件版本控制规则来确定是否安装软件包提供的组件。如果安装程序确定需要 根据密钥文件替换组件,然后它使用每个已安装文件的文件版本控制规则来确定是否替换文件。
任何安装程序的核心都是文件的实际安装。确定是否安装文件是一个复杂的过程。在最高级别,这一决定取决于 文件所属的组件是否标记为安装。一旦确定要复制一个文件,如果另一个文件具有相同的过程,过程会很复杂 名称存在于目标文件夹中。在这种情况下,做出决定需要一组涉及以下属性的规则:
- 版本
- 日期
- 语言
安装程序仅在尝试将文件安装到已包含同名文件的位置时使用这些规则。在这种情况下,Windows 安装程序使用 以下规则,在其他条件相同的情况下,判断是否安装。
最高版本获胜——在所有其他条件相同的情况下,最高版本的文件获胜,即使计算机上的文件具有最高版本也是如此。
版本化文件 Win - 版本化文件安装在非版本化文件之上。
支持产品语言—如果正在安装的文件与计算机上的文件的语言不同,则支持使用与正在安装的产品相匹配的语言的文件 安装。语言中性文件被视为另一种语言,因此正在安装的产品再次受到青睐。
多种语言不匹配—排除正在安装的文件和计算机上的文件之间的任何共同语言后,根据 正在安装的产品需要什么。
Preserve Superset Languages—保留支持多种语言的文件,无论它是否已在计算机上或正在安装。
非版本化文件是用户数据—如果修改日期晚于文件在计算机上的创建日期,请不要安装该文件,因为用户自定义会 删除。如果修改日期和创建日期相同,请安装该文件。如果创建日期晚于修改日期,则认为文件未修改,安装文件。
在次要升级期间,可以使用 REINSTALLMODE 属性 覆盖或修改默认文件版本控制规则。安装程序使用由 REINSTALLMODE 属性 在安装、重新安装或修复文件时。 REINSTALLMODE 的默认值 属性 是 "omus".
现在您必须决定是要为您的 MSI 进行次要升级还是主要升级。如果是 Major Upgrade,则默认情况下会卸载旧版本的产品 在安装新版本之前。使用下面的 link "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.
如果您坚持进行小升级,那么您将需要使用上面提到的 REINSTALLMODE 属性 覆盖默认文件版本控制规则,并使用代码 "d"
d Reinstall if the file is missing or a different version is present.
然后使用以下 msiexec 命令:
msiexec.exe /i installer.msi REINSTALL=ALL REINSTALLMODE=vdmus
- MINOR UPGRADE
- MAJOR UPGRADE
- MINOR UPGRADE - Replace Existing Rules
- MINOR UPGRADE - File Versioning Rules
- REINSTALLMODE
- WIX MAJOR UPGRADE
希望对您有所帮助!
wix中产品代码为“*”。 MSI 从作为 msi 的一部分部署的 exe 之一获取版本。当 MSI 是 installed.exe 版本时,exe 安装服务,因此 MSI 将具有相同的版本。 因此,当安装低版本的MSI时,exe也将具有相同的版本,因此exe与服务器中已有的exe进行比较,并决定不安装,因为高版本已经存在。
所以我做的是"RemoveExistingproduct"之前="costing "
这解决了在更高版本之前删除产品的问题。
如果有任何其他选择,请告诉我,这是正确的做法吗?后果是什么。