Обновление Wix Major: как предотвратить переустановку службы Windows - PullRequest
14 голосов
/ 09 февраля 2010

Я работаю над установщиком, который должен установить несколько служб Windows. Мы делаем новые сборки (с новыми MSI-файлами) довольно часто, и мы используем крупные обновления, чтобы упростить установку поверх предыдущей установки.

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

Мы используем ServiceInstall и ServiceControl внутри компонента, который содержит служебный файл exe. Есть ли способ сделать выполнение ServiceInstall условным (используя условие типа REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE), чтобы служба не удалялась при обновлении (просто остановлена, чтобы мы могли обновить файлы)?

Одним из решений будет использование пользовательских действий, но, может быть, есть лучший способ?

Спасибо!

Ответы [ 5 ]

11 голосов
/ 17 февраля 2010

Кажется, я искал не в том месте. Решение моей проблемы - добавить NOT UPGRADINGPRODUCTCODE к стандартному действию DeleteServices.

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

ОБНОВЛЕНИЕ: условие для DeleteServices доступно из WiX в элементе InstallExecuteSequence.

1 голос
/ 31 марта 2015

Вот как должно выглядеть решение:

<DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices>

Добавьте это под тегом InstallExecuteSequence.

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

Примечание 2: вам не нужно использовать тег CDATA, он также может выглядеть следующим образом:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
0 голосов
/ 31 марта 2015

Использование условий стандартных действий для сервиса не будет масштабироваться после одного сервиса.

Способ сделать это состоит в том, чтобы запланировать RemoveExistingProducts до InstallFinalize. Затем убедитесь, что ваша новая сборка имеет служебный EXE-файл с той же версией, что и заменяемая. Таким образом установщик Windows не удалит и не переустановит этот компонент.

Наконец, поместите ваши данные конфигурации в другой компонент, который будет установлен, и закодируйте вашу службу, чтобы заметить, что данные изменили конфигурацию, и перезагрузите их при необходимости.

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

0 голосов
/ 12 марта 2015

Я создал 2 компонента для одного и того же exe с одним условием каждый. Один для WIX_UPGRADE_DETECTED и один для NOT WIX_UPGRADE_DETECTED. В WIX_UPGRADE_DETECTED я бы не включил элемент serviceinstall, а в NOT WIX_UPGRADE_DETECTED - элемент serviceinstall.

0 голосов
/ 17 февраля 2010

WiX будет обновлять компоненты, только если их версия новее. Он проверяет только одно из полей (версия файла версии сборки, я не помню), чтобы вы могли сохранять информацию о текущей версии в одном и сохранять статичность в другом. Это может быть взлом, который работает для вас ...

...