Ответ 1
Общая концепция MSI заключается в том, что существует 1:1 сопоставление между компонентом GUID (уникальный идентификатор) и абсолютным путем (установить местоположение/путь ключа). Полный путь, включая имя файла, если оно есть. См. Обновление ниже для новой функции Wix для автоматической автомании с этим.
Я использую некоторые простые правила для решения чрезмерно сложных и бессмысленных правил компонентов:
- Всегда используйте отдельный компонент для каждого файла (даже для не-двоичных файлов). Это позволяет избежать всех проблем. Есть несколько исключений:
- Многостраничные сборки .NET должны быть в одном компоненте, так как они всегда должны быть установлены/удалены как единое целое.
- Несколько других, общих типов файлов входят в "совпадающие пары" - они принадлежат друг другу. Часто это файлы содержимого и индекса. В качестве примера рассмотрим файлы справки Microsoft:
- . Файлы HLP и .CNT принадлежат друг другу.
- .CHM и .CHI файлы принадлежат друг другу.
- Вероятно, существует несколько таких типов файлов, которые принадлежат друг другу и поэтому должны быть помещены в один и тот же компонент, поэтому они устанавливают/удаляют вместе - я подозреваю, что определенные файлы сертификатов являются кандидатами. Трудно найти определенный список. Просто спросите себя "эти файлы всегда принадлежат друг другу" - так они всегда появляются попарно всякий раз, когда есть новая версия? Если да, то установите их через один и тот же компонент. Установите файл версии, если таковой имеется, в качестве ключевого файла.
- Помните, что после того, как вы выделили GUID для компонента, он установлен в качестве камня для этого пути ключа компонента (абсолютный путь). Если вы переместите файл в новое место или переименуете файл, укажите ему новый компонентный GUID (поскольку абсолютный путь отличается от него новым идентификатором).
- В итоговых идентификаторах GUID привязаны к абсолютному месту установки, а не к определенному файлу. GUID не следует за файлом, если он перемещается. Ссылка GUID подсчитывает абсолютное местоположение, а не файл как таковой.
- Не добавлять и не удалять файлы из существующего компонента. Всевозможные проблемы обновления и исправления.
Некоторые примеры:
- Переименуйте файл C:\Program Files\MyCompany\MyApp\MyFile.exe в C:\Program Files\MyCompany\MyApp\MyFile_NEW.exe. Что это значит для создания компонентов? Это новый абсолютный путь установки, поэтому вы создаете новый GUID для хост-компонента, или вы добавляете новый компонент и удаляете старый (который имеет тот же эффект).
- Обновленный MSI предоставляет новую версию MyFile.exe. Место такое же, как и раньше, это означает, что GUID компонента не должен меняться.
UPDATE. У WIX теперь есть новая функция функция автоматического создания компонента GUID что вычисляет GUID, пока целевой путь остается неизменным. Я не пробовал это, чтобы быть честным, но многие, похоже, используют его без проблем, и Rob Mensching (автор Wix) утверждает, что он безопасен для нормального использования. В качестве концепции я настоятельно рекомендую это, так как она содержит некоторые автомагии и защищает вас от некоторой сложности.
Также обратите внимание, что вы можете оставить много атрибутов источника из вашего файла Wix xml и полагаться на настройки по умолчанию Wix вместо жесткого кодирования значения.