首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Wix组件GUID "*“对此组件无效

Wix组件GUID "*“对此组件无效
EN

Stack Overflow用户
提问于 2019-03-01 03:46:56
回答 1查看 1.3K关注 0票数 1

我正在尝试解决在AppData (per-user installation)下安装的同一文件夹中的多个组件自动生成GUID的问题。

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

下面是代码片段:

代码语言:javascript
复制
<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>

和组件的错误:

代码语言:javascript
复制
 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,升级解码..但是,在具有注册表KeyPath=yes的同一台机器上安装了多组应用程序(每个用户但不同的目录- AppData/local/setA和AppData/local/setB)的环境中,组件GUID (在我的例子中是Component Id='MainExecutable')又如何呢?如果productId是不同的(所有安装都是用.wxs硬编码的),这个组件可以为我们所有的安装安装固定的GUID吗?谢谢你的解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 06:15:40

Short AnswerYou 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

  • 为每个用户重复!=>不可能有自动guid。It is not unique.
  • User 1 Key path:C:\Profiles\User1\Product\File.exeHKCU\Software\Product\MyKeyPath
  • User Key path:HKCU\Software\Product\MyKeyPath

2:C:\Profiles\User2\Product\File.exe,Key path:HKCU\Software\Product\MyKeyPath不是密钥路径:C:\Profiles\User2\Product\File.exe,2密钥路径:HKCU\Software\Product\MyKeyPath密钥路径

对于记录,如果您设置一个用户配置文件基于磁盘的键路径(而不是您应该使用的注册表键路径),将会发生什么:。

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

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

Read-Only Templates:一个常规问题首先:建议您不要将文件直接安装到用户配置文件文件夹中。相反,您应该将它们安装到Program Files下的主安装文件夹中,然后在应用程序启动期间为使用该应用程序的每个用户复制它们。然后,可以在应用程序启动时按需将文件复制到每个用户配置文件(如果实现得当,则为upgrades are possible too)。

Technically:对于具有相同/非唯一键路径的组件,不能使用自动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.这应该可以很好地工作。只需将文件移动到每台计算机的路径并设置一个自动guid即可。升级的文件将覆盖旧文件,如果需要,您可以在启动时将较新的文件复制到用户配置文件中。在大多数情况下,这是一项危险的操作。

MSI cloud:我喜欢基于云的方法,直接从互联网或内部网按需将文件下载到用户配置文件中,作为通过部署的替代方案。这完全取决于您有权访问哪些内容。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54933185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档