MSI / WiX - Назначение GUID компонентов во время множественных преобразований экземпляров - PullRequest
6 голосов
/ 19 февраля 2011

Используя WiX 3.5, у меня есть MSI с экземплярами преобразований, что позволяет мне устанавливать программное обеспечение на одну и ту же машину с разными названиями продуктов.Для этого у меня есть «жестко запрограммированный» список идентификаторов и имен продуктов в файле .wxs, определенных условно.Однако у меня есть только одно определение Feature-ComponentRef, которое включает как файловые, так и не файловые ресурсы.

Установка выглядит нормально, но удаление экземпляров демонстрирует поведение, упомянутое в этих двух источниках:

http://msdn.microsoft.com/en-us/library/aa367797(v=VS.85).aspx

и

http://windows -installer-xml-wix-toolset.687559.n2.nabble.com / множественный экземпляр-преобразование-пошаговое руководство-Simple-Ad-to-WiX-to-Make-Them-Easier-td708828.html

В частности, ни один из файловых ресурсов (в данном случае записи реестра) не удаляется, кроме каксамый последний экземпляр моего приложения.(то есть, если я удаляю в следующем порядке: instance1, instance2 и instance3 - удаляются только не файловые ресурсы instance3.

Я предполагаю, что это связано с отсутствием уникальных GUID для нефайловых компонентов (тогда как это неЭто не проблема для файловых компонентов)

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

Это позволило бы создавать экземпляры во время выполнения, а не жестко прописывать их в .wxs заранее, и удалять их без ошибок.

Имеет ли это смысл? Будет ли Burn все лучше делать?:)

Ответы [ 2 ]

4 голосов
/ 02 июня 2011

Начиная с версии v3.6.1511.0, для компонентов теперь есть атрибут «MultiInstance». Это позволяет генерировать guid на лету для каждого экземпляра в соответствии с предложением Джоша Роуза в его посте в списке рассылки WiX (см. Ссылку в OP). Я проверил, и это работает правильно, так как данные реестра удаляются при удалении текущего экземпляра, а не при удалении экземпляра LAST.

1 голос
/ 19 февраля 2011

Вам не нужно иметь уникальные идентификаторы компонентов, но вы должны иметь уникальные ключи реестра.Извлечение:

Создание нескольких экземпляров с помощью преобразований экземпляров

В статье упоминается:

Чтобы сохранить непрофильные данные каждого экземпляра изолированными,базовый пакет должен собирать нефайловые данные в наборы компонентов для каждого экземпляра.Затем должны быть установлены соответствующие компоненты на основе условных операторов, которые зависят от идентификатора экземпляра.

Я на самом деле не знаю, о чем они там говорят.Я создал установщики с несколькими экземплярами n-Tier, в которых все файлы были изолированы уникальным INSTALLDIR (настраиваемое действие типа 51 во время выполнения для изменения целевого объекта на основе InstanceID), и все данные реестра были изменены с использованием InstanceID как части пути, как упоминалосьв статье.Я поддерживал до шестнадцати уникальных экземпляров с уникальными данными конфигурации и уникальными номерами версий (каждый экземпляр мог обслуживаться посредством серьезного обновления, за исключением других экземпляров.) Все это заключалось в поддержке модели развертывания SaaS для приложения nTier, и я никогдакогда-либо приходилось создавать компоненты с уникальными GUIDS и / или условными выражениями.

Единственное, что мне пришлось сделать, - это на стороне клиента они хотели ярлык на рабочем столе.(Клиент поддерживает несколько экземпляров также потому, что у сайта может быть v1.0 в производственной и v1.1 в тестовой версии)

из-за того, что мне не удалось изменить имя папки (исправлено), а также из-за того, что таблица MSI ShortCut не поддерживаетДля поддержки форматируемости мне пришлось написать пользовательское действие, чтобы динамически создавать ShortCut при установке таблицы, используя InstanceID в таблицу TEMP, а затем MSI создал для меня ярлык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...