Wix 组件 GUID“*”对此组件无效

Wix component GUID "*" is not valid for this component

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

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

这是代码片段:

<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 文件,它只安装基本文件和快捷方式。然后应用程序本身有自动更新系统下载所有其他文件。

我们的应用程序可以在同一台机器上安装 "mupliple sets of versions"(例如 A 组:"app 1 demo, app 2 test" 和 B 组:"app 2 demo, app 2 test")。每个集合和集合中的每个版本都可以有不同的文件(这是更新系统本身的工作)。

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

Short Answer: 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. Simpler approach: Install files to a per-machine location and copy them into each user-profile on application launch instead of installing them per-user via an MSI. This de-couples all user-profile files from common deployment problems (overwriting / resetting, upgrade problems, uninstall problems, etc...). Auto-Guids are possible for per-machine key paths - they are unique per component.

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

  • 为每个用户重复! => 无法自动引导。它不是唯一的。
  • 用户 1: C:\Profiles\User1\Product\File.exe, 关键路径: HKCU\Software\Product\MyKeyPath
  • 用户 2: C:\Profiles\User2\Product\File.exe, 关键路径: HKCU\Software\Product\MyKeyPath

郑重声明,如果您设置基于用户配置文件磁盘的密钥路径(而不是您应该使用的注册表密钥路径),将会发生以下情况:Color illustration.

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

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

Read-Only Templates:首先是一个普遍问题:建议您不要将文件直接安装到用户配置文件中文件夹。相反,您应该将它们安装到 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。这应该可以正常工作。只需将文件移动到每台机器的路径并设置自动引导。升级后的文件将覆盖旧文件,您可以在启动时复制新文件覆盖用户配置文件中的文件 - 如果需要的话。大多数时候都是冒险操作。


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

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

  • Create folder and file on Current user profile, from Admin Profile
  • Wix deferred custom action access denied
  • Create a .config folder in the user folder