【问题标题】:Wix component GUID "*" is not valid for this componentWix 组件 GUID“*”对此组件无效
【发布时间】:2019-02-28 19:46:55
【问题描述】:

我正在尝试通过为 AppData(按用户安装) 下安装的同一文件夹中的多个组件自动生成 GUID 来解决我的问题。

在编辑之前,我有一个包含 3 个文件的组件。然后我决定为这个组件使用自动 GUID,所以我把它分成了 3 个组件(每个都有一个文件)。我以为现在我可以使用Component GUID with *registry value with KeyPath=yes 但它不起作用。非常感谢任何建议。

这里是代码sn-p:

<Directory Id='INSTALLDIR' Name='$(var.myInstallDir)'>

        <Component Id='MainExecutable' Guid='I_WOULD_LIKE_ASTERISK_HERE_ALSO_BUT_HAVE_HARD_CODED_GUID' >

          <RemoveFolder Id='RemoveINSTALLDIR' Directory='INSTALLDIR' On='uninstall' />
          <util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" /> 

          <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Name='Path' Value='[INSTALLDIR]'  KeyPath='yes'/>

          <File Id='ffile1' Name='file1' DiskId='1' Source='file1'> </File>

          <Shortcut Id="startmenujfile" Directory="ProgramMenuDir" Name='$(var.myAppName)'
          Target="[SystemFolder]cmd.exe" Arguments=" /c START javaw.exe -jar [INSTALLDIR]file1.jar ."
          WorkingDirectory="INSTALLDIR"
          Icon="apsoiconmultiico" IconIndex="0" /> 

          <Shortcut Id="desktopjfile" Directory="DesktopFolder" Name='$(var.myAppName)'
          Target="[INSTALLDIR]file1.jar" Arguments=" ."
          WorkingDirectory="INSTALLDIR" 
          Icon="iconmultiico" IconIndex="0" /> 

        </Component>

        <Component Id='MainExecutable2' >
          <File Id='ffile2' Name='file2' DiskId='1' Source='file2' />
          <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes'/>
        </Component>

        <Component Id='MainExecutable3' >
          <File Id='ffile3' Name='file3' DiskId='1' Source='file3' />
          <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes'/>
        </Component>
      </Directory>

组件错误:

 error CNDL0230 : The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components with registry keypaths and files cannot use an automatically generated guid. Create multiple components, each with one file and/or one registry value keypath, to use automatically generated guids.

谢谢

编辑:

感谢@Stein Åsmul 的回答。我需要再问一次..

我正在尝试解决这个问题,因为我们正在从 Java Web Start (jnlp) 迁移到非常简单的 .msi 文件,该文件仅安装基本文件和快捷方式。然后应用程序本身具有自动更新系统,可以下载所有其他文件。

我们的应用可以在同一台机器上安装“多组版本”(例如设置 A:“应用 1 演示,应用 2 测试”和设置 B:“应用 2 演示,应用 2 测试”)。每个集合和集合中的每个版本都可以有不同的文件(这是更新系统本身的工作)。

现在是问题。我是 .msi 安装的新手,所以我不确定很多步骤。我知道productId,upgradecode ..但是在同一台机器上安装多组应用程序的环境中的组件GUID(在我的情况下为Component Id='MainExecutable')呢(每个用户但不同的目录-AppData/local/setA和AppData/local/setB ) 与注册表 KeyPath=yes?如果 productId 不同(所有安装都在 .wxs 中硬编码),这个组件能否为我们所有的安装提供固定的 GUID?谢谢你的解释。

【问题讨论】:

  • 回答您尝试添加的第二个问题:MSI 不适合就地升级自身的自动升级应用程序。 MSI 是一种部署技术,会跟踪所有已安装的文件和版本,自动升级系统会干扰这一点。在design reasons and limitations 的同一系统上,MSI 也不容易用于multi-installations。建议您使用不同的部署技术,或更改您的部署设计。您在公司环境中吗?
  • 是的,这是我们公司的应用程序。我还使用 .exe 文件测试了部署(与 msi 相比超级简单)。但是.msi 可以很容易地与 AD 一起部署。万一该用户进行修复(但它已被禁用)并安装较早的版本,那就什么都没有了。自动更新系统将带回最新版本。我编辑的问题的第二部分呢?
  • 您无法在不引起problems that are impossible to deal with 的情况下自动更新MSI 安装并动态覆盖文件。 MSI 跟踪已安装的内容并修复已安装的文件。 AppV 和 MSIX 等较新的部署技术可能满足您的需求。我会调查他们。如果他们允许AppV 和/或MSIX,请咨询您的部署人员。 App-V 将应用程序从服务器实时“流式传输”到任何客户端。
  • 据我了解,我可以在应该禁用自我修复和其他问题的组件上使用GUID = "" 的概念。因此,如果我设置component MainExecutable2,而不是添加一个文件和一个RegistryValueKeyPath='yes'(就像我的问题示例中一样)它会起作用吗?我可以打电话给candle.exelight.exe
  • 不推荐,但我见过类似的东西。我什至帮助人们打包它,所以它可以在没有太多事件的情况下工作。卸载将是一个问题,更改注册表设置和清理可能会导致自我修复启动。您还将很难确定安装了哪个版本?如果还有其他技术可以使用,为什么还要与风车作斗争?

标签: wix guid


【解决方案1】:

简答You cannot use auto-guids for components that have the same / non-unique key path - which is the case for per-user registry key paths。更简单的方法:将文件安装到每台机器的位置,并在应用程序启动时将它们复制到每个用户配置文件中,而不是 通过 MSI 为每个用户安装它们。这将所有用户配置文件解耦 来自常见的部署问题(覆盖/重置、升级问题、卸载问题等)。 Auto-Guids 可以用于每台机器的关键路径 - 它们对于每个组件都是唯一的。

每用户密钥路径HKCU\Software\Company\Product\MyKeyPath

  • 为每个用户重复! => 没有自动引导可能。它不是唯一的。
  • 用户 1C:\Profiles\User1\Product\File.exe密钥路径@987654332 @
  • 用户 2C:\Profiles\User2\Product\File.exe密钥路径@987654334 @

为了记录,如果您设置基于用户配置文件磁盘的密钥路径(而不是您应该使用的注册表密钥路径)会发生什么:Color illustration

每台机器的密钥路径C:\Program Files\Company\Product\Main.exe

  • 只有一个安装实例!唯一的键路径允许自动引导。

只读模板:首先是一般性问题:建议您不要将文件直接安装到用户配置文件文件夹中。相反,您应该将它们安装到 Program Files 下的主安装文件夹,然后在应用程序启动期间为使用该应用程序的每个用户复制它们。然后可以根据需要和启动应用程序将文件复制到每个用户配置文件(upgrades are possible too,如果您实施得当)。

技术上:您不能对具有相同/非唯一键路径的组件使用自动引导。阅读这个旧答案也许可以最好地理解技术原因:Change my component GUID in wix? 本质上,密钥路径必须是唯一的,才能创建自动 GUID,而每个用户的注册表项并非如此。所有用户的路径都相同 - 指向相同的注册表项(即使每个用户的内容不同)。 MSI 技术的限制。

Note that if you install to a per-machine path you will be able to use auto-GUIDs since you can have a unique file key path for the component。这应该可以正常工作。只需将文件移动到每台机器的路径并设置自动引导。升级后的文件将覆盖旧文件,您可以在启动时将新文件复制到用户配置文件中的文件上 - 如果需要。大部分时间都是有风险的操作。


:我喜欢使用基于云的方法直接从 Internet 或 Intranet 按需将文件下载到用户配置文件中,作为通过 MSI 部署的替代方法.这完全取决于您可以访问什么。

更多细节:围绕相同点的已有答案太多,重写它没有任何价值。有关使用 MSI 部署每用户文件的更多详细信息,请查看以下链接:

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多