Wix Major Upgrade: как я могу предотвратить переустановку Windows?

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

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

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

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

Спасибо!

Ответ 1

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

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

UPDATE: условие для DeleteServices доступно из WiX в элементе InstallExecuteSequence.

Ответ 2

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

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

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

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

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

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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