WiX и общие, версионные компоненты - PullRequest
1 голос
/ 25 февраля 2010

Это должно быть общей потребностью, но я почти не нахожу в ней никаких ссылок в Интернете ...

У меня есть продукт, который имеет три набора компонентов, один установленный на сервере, один в веб-заголовке и один на компьютере разработчика. Все три комплекта могут быть установлены на одной машине и должны мирно сосуществовать.

Как у меня было вчера, каждый компонент устанавливался в другое место и работал нормально, но это было просто временно, так как некоторые файлы, сборки gac'd и параметры реестра должны были использоваться совместно. Теперь я сделал модуль слияния из общих компонентов, и этот новый сценарий с модулем слияния работает отлично во время установки в идеальных условиях, и у меня есть серьезные обновления одной MSI, все выяснено.

Проблема возникает при установке MSI, когда версия модуля слияния в установочной MSI ниже, чем у уже установленной версии (другой MSI) - более новая версия перезаписывается более старой версией! Кроме того, при выполнении процедуры деинсталляции любого из трех msis общие ресурсы удаляются, даже если они все еще используются другими установленными компонентами.

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

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

В случае, если я просто что-то упустил, вот важные части файла слияния: номер версии моего модуля слияния (y в "wxy") увеличивается с каждой сборкой, идентификатор пакета остается фиксированным, и каждый компонент имеет Shared="yes" (хотя я пробовал и без этого).

Я начал сохранять различные номера версий в реестре, и я подумал, что, возможно, я смогу условно установить функцию модуля слияния, только если номер версии в реестре отсутствовал или был ниже. Но условные аргументы не могут правильно оценить w.x.y.z, как сказано в документации. Затем в документации предлагается AppSearch, но AppSearch RegistrySearch может только проверять наличие, но не сравнение номеров версий. Очевидно FileSearch может, но номера версий файла сборки не будут увеличиваться с каждой сборкой.

И я читал, что у MergeModules много проблем - возможно, это они - но wixlibs, похоже, тоже не предлагают решений этих проблем.

Так, как правильно делать управление версиями модуля слияния ??? На Amazon я нашел книгу с записью ТОС под названием «Управление версиями модуля слияния», но книга вышла из печати. : -Р

1 Ответ

1 голос
/ 01 апреля 2010

Мне кажется, что это поведение, которое мы хотим - всегда устанавливаем лучшую версию общего компонента, - поддерживается только с 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

...