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

时间:2016-02-18 07:37:04

标签: wix windows-installer wix3

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

部分原因我首先在MSIv1上部署最新的MSI说" MSIv2到OPS环境,MSIv2自动卸载MSIv1并安装MSIv2而没有任何问题。

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

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

2 个答案:

答案 0 :(得分:8)

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

您是否更改了2个MSI版本之间的产品代码?我的猜测是你还没有改变两个版本之间的产品代码和Windows安装程序正在考虑的问题 这是一个小小的升级。首先要了解Major vs Minor升级之间的区别。

次要升级

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

重大升级

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

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

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

  1. 日期
  2. 语言
  3. 安装程序仅在尝试将文件安装到已包含具有相同名称的文件的位置时才使用这些规则。在这种情况下,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.
    

    如果您坚持进行次要升级,则需要使用上面提到的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
    
    1. MINOR UPGRADE
    2. MAJOR UPGRADE
    3. MINOR UPGRADE - Replace Existing Rules
    4. MINOR UPGRADE - File Versioning Rules
    5. REINSTALLMODE
    6. WIX MAJOR UPGRADE
    7. 希望有所帮助!

答案 1 :(得分:0)

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

所以我在=“花费”

之前做的是“RemoveExistingproduct”

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

如果有其他替代方案,请告诉我,这是一种正确的做法,后果是什么。