Мы используем WiX 3.5 для создания установщика для одного из наших продуктов. Для простоты мы обрабатываем обновления версий с помощью крупных обновлений, например:
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="Laterversionfound" />
Мы не указываем атрибут Schedule, что означает, что действие RemoveExistingProducts должно выполняться после «InstallValidate», то есть будет выполнено полное удаление старой версии перед установкой новой версии.
Мы устанавливаем некоторые параметры реестра HKLM, которые пользователь должен настроить после установки. Поскольку при крупном обновлении выполняется полное удаление с последующей переустановкой, мы теряем пользовательские настройки в реестре. В идеале мы должны иметь возможность сохранять их при обновлении.
Мои ключевые компоненты реестра выглядят так:
<Component Id="regserver" Guid="[guid]">
<RegistryValue Root="HKLM" Key="Software\Our Company\Our Product" Name="Server" Value="" Type="string" KeyPath="yes" />
</Component>
Я попытался установить для свойства NeverOverwrite компонентов значение «yes», но это имеет неприятный эффект, заключающийся в невозможности воссоздать ключи - предположительно потому, что он проверяет, существуют ли ключи до удаления ( что, очевидно, они и делают), затем они удаляются при деинсталляции, но не воссоздаются снова.
Я также попытался установить атрибут «RemoveFeatures» в элементе MajorUpgrade, чтобы удалить все, кроме ключей reg. Тем не менее, остается две версии продукта, так как функция, содержащая ключи реестра, принадлежит старой версии.
Мой следующий шаг - попробовать запланировать опцию RemoveExistingProducts в другой момент, хотя я ожидаю некоторой боли при использовании некоторых наших настраиваемых действий.
Итак, мой вопрос: есть ли способ достичь того, что нам нужно, не меняя место, где запланировано RemoveExistingProducts?