WiX и общие, версионные компоненты
Это должно быть общей потребностью, но я нахожу едва ли какие-либо ссылки на это в Интернете...
У меня есть продукт, который имеет три набора компонентов, один установленный на сервере, один в веб-заголовке и один на компьютере разработчика. Все три комплекта могут быть установлены на одной машине и должны мирно сосуществовать.
Как и вчера, каждый компонент устанавливался в другое место и работал нормально, но это было только временно, так как некоторые файлы, сборки gac и настройки реестра должны были использоваться совместно. Теперь я сделал модуль слияния из общих компонентов, и этот новый сценарий слияния модулей прекрасно работает во время установки в идеальных условиях, и у меня есть серьезные обновления одной MSI.
Проблема возникает во время установки MSI, когда версия модуля слияния в установочной MSI ниже, чем у уже установленной версии (другой MSI) - более новая версия перезаписывается более старой версией! Кроме того, после процедуры удаления какой-либо из трех msis общая информация удаляется, даже если она все еще используется другими установленными компонентами.
По большей части я понимаю, почему у меня такое поведение, но я не понимаю, как я должен настраивать свои установщики так, чтобы эти компоненты можно было использовать совместно, не имея отдельного установщика для общих компонентов. Кроме того, я не хочу ни одного большого установщика - он не будет хорошо масштабироваться.
Я хочу, чтобы три установщика содержали любую последнюю версию компонентов в модуле слияния, которая была доступна во время сборки. Во время установки, если установлена более новая версия общих компонентов, не перезаписывайте их. Во время удаления (и обновления) количество ссылок, которые должны были быть отслежены, будет определять, следует ли удалять общие элементы.
В случае, если я просто что-то упустил, вот важные части файла слияния: номер версии моего модуля слияния (y в "wxy") увеличивается с каждой сборкой, идентификатор пакета остается фиксированным, и каждый компонент имеет Shared="yes"
(хотя я пробовал и без этого).
Я начал хранить различные номера версий в реестре и подумал, что, возможно, я смогу условно установить функцию модуля слияния, только если номер версии в реестре отсутствовал или был ниже. Но условные аргументы не могут правильно оценить wxyz, как сказано в документации. Затем в документации предлагается AppSearch, но AppSearch RegistrySearch может только проверять наличие, но не сравнение номеров версий. Очевидно FileSearch может, но номера версий файла сборки не будут увеличиваться с каждой сборкой.
И я читал, что у MergeModules много проблем - возможно, это они - но wixlibs, похоже, тоже не предлагают решений этих проблем.
Так, как правильно сделать управление версиями модуля слияния??? Я нашел книгу, в которой есть запись TOC под названием "Управление версиями модуля слияния" на Amazon, но эта книга больше не печатается.:-П
1 ответ
Мне кажется, что это поведение, которое мы хотим - всегда иметь лучшую версию общего компонента - поддерживается только в MSI 4.5 и выше. Так что, возможно, это не проблема самого WiX, но я почти ничего не знаю о WiX.
Мы хотим, чтобы атрибут msidbComponentAttributesShared (0x0800) был установлен в таблице компонентов для общего компонента. Может быть, вы можете проверить свой МСМ с Orca для этого.
Я думаю, что это сообщение в блоге упоминает кое-что об этом (но это, вероятно, не очень поможет вам здесь): http://blogs.msdn.com/windows_installer_team/archive/2008/03/29/windows-installer-4-5-servicing-enhancements-shared-components-and-patch-uninstall.aspx