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

问题描述 投票:1回答:1

我正在尝试通过为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版本”(如设置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 =是吗?如果productId不同(在所有安装的.wxs中进行硬编码),此组件是否可以为我们的所有安装固定GUID?谢谢你的解释。

wix guid
1个回答
2
投票

简答: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为每个用户安装它们。这会将所有用户配置文件与常见部署问题(覆盖/重置,升级问题,卸载问题等等)分离。每台计算机密钥路径都可以使用自动导航 - 它们对于每个组件都是唯一的。

每用户密钥路径: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

对于记录,如果您设置userprofile基于磁盘的密钥路径(而不是您应该使用的注册表密钥路径),将会发生以下情况:Color illustration

每机器关键路径:C:\Program Files\Company\Product\Main.exe

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

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

技术上:您不能将自动guid用于具有相同/非唯一键路径的组件。通过阅读这个旧答案,可能最好地理解技术原因: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部署每用户文件的更多详细信息,请查看以下链接:

© www.soinside.com 2019 - 2024. All rights reserved.