GUID компонента Wix "*" недопустим для этого компонента - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь решить мою проблему с помощью автоматической настройки GUID для нескольких компонентов в одной папке, установленной в AppData (установка для каждого пользователя) .

До редактирования у меня был один компонент с 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-файлу, который устанавливает только элементарные файлы и ярлыки.Тогда само приложение имеет систему автоматического обновления, которая загружает все остальные файлы.

Наше приложение может иметь «множество наборов версий», установленных на одном компьютере (например, набор A: «демонстрация приложения 1, тест приложения 2» и набор B: «демонстрация приложения 2, тест приложения 2»).Каждый набор и каждая версия в наборе могут иметь разные файлы (это работа для самой системы обновления).

Теперь вопрос.Я новичок в установке .msi, поэтому я не уверен в отношении многих шагов.Я знаю идентификатор продукта, код обновления ... но как насчет GUID компонента (в моем случае Component Id='MainExecutable') в среде с несколькими наборами приложений, установленных на одном компьютере (для пользователя, но в другом каталоге - AppData / local / setA и AppData / local / setB) с реестром KeyPath = да?Может ли этот компонент иметь фиксированный GUID для всех наших установок, если productId отличается (так жестко закодировано в .wxs для всех установок)?Спасибо за объяснение.

1 Ответ

0 голосов
/ 01 марта 2019

Короткий ответ : 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

Для записи вот что произойдет, если вы зададите путь к ключу на основе пользовательского профиля на диске (в отличие от реестраПуть к ключу, который вы должны использовать): Цветная иллюстрация .

Путь к ключу для машины : C:\Program Files\Company\Product\Main.exe

  • Только один экземпляр установки!Уникальный путь ключа позволяет выполнять автоматическое наведение.

Шаблоны только для чтения : сначала общая проблема: рекомендуется не делатьустановить файлы непосредственно в папки профиля пользователя.Скорее вы должны установить их в свою основную папку установки в Program Files , а затем скопировать их на место во время запуска приложения для каждого пользователя, который использует приложение.Затем файлы могут быть скопированы в каждый профиль пользователя по требованию и при запуске приложения ( обновления также возможны , если вы правильно его реализуете).

Технически : нельзя использовать автогид для компонентов, имеющих одинаковый / неуникальный путь ключа.Технические причины, возможно, лучше всего понять, прочитав этот старый ответ: Изменить GUID моего компонента в 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.Это должно работать нормально.Просто переместите файлы по пути к машине и установите автогид.Обновленные файлы будут перезаписывать более старые файлы, и вы можете при запуске скопировать более новые файлы поверх тех, которые находятся в профиле пользователя, если это желательно.Большую часть времени это рискованная операция.


Облако . Мне нравятся облачные подходы для загрузки файлов в профиль пользователя напрямую по запросу.из Интернета или интранета в качестве альтернативы развертыванию через MSI.Все зависит от того, к чему у вас есть доступ.

Подробнее : слишком много ранее существовавших ответов, которые вращаются вокруг одних и тех же точек, чтобы иметь какое-либо значениев переписывании это.Пожалуйста, проверьте следующие ссылки для получения более подробной информации о развертывании файлов для каждого пользователя с MSI:

...