Как запретить Wix устанавливать более старую версию?
У меня есть приложение, которое мы переключаем на установщик WiX. Пока что, кажется, все идет хорошо. Единственная проблема, с которой я столкнулся, заключается в том, что, если загрузить и попытаться установить более старую версию, она делает это.
И это немного проблема. Если установлена более новая версия, я не хочу устанавливать более старую версию. Я думал, что проблема была с компонентом "Обновление", но я должен признать, что столкнулся со стеной. Как я могу изменить его, чтобы более старые версии видели, что уже установлена более новая версия, а не устанавливали ее?
Мой тестовый продукт теперь в версии 2.4 (самая новая версия, которую мы пытаемся выпустить). Он корректно обновляется до 2.4.1 или 2.5 или 3.0. Но если я делаю версию 3.0, а затем запускаю MSI для 2.4, он все равно добавляет ее.
Мой компонент обновления:
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion Maximum="2.4" Property="PREVIOUSVERSIONSINSTALLED" />
<UpgradeVersion Minimum="1.0" Property="NEWERPRODUCTFOUND" OnlyDetect="yes" IncludeMinimum="no" />
</Upgrade>
Следовать за:
Следуя предложению Steins, я получил такую ошибку
"Дубликат символа" WixAction:InstallExecuteSequence/RemoveExistingProducts "найден"
После осмотра в файле Product.wxs под <InstallExecuteSequence>
Я должен был удалить <RemoveExistingProducts Sequence="6550" />
потому что это был дубликат, на который он ссылался. После этого установщик сработал, и старые версии больше не могут быть установлены поверх новых версий.
1 ответ
Пакеты Futures Past: вы не можете изменить старые версии вашего пакета, чтобы обнаружить более новые. Вы должны встроить защиту в ваши пакеты с самого начала. Packages need to be pre-cognitive. It's an industry problem.
Modern Times: элементы WiX, которые вы показываете выше, "в старом стиле". Здесь описана новая "удобная функция": как вы определяете установленные версии продукта при каждом запуске? Он включает в себя "новый" элемент MajorUpgrade. Этот новый элемент MajorUpgrade обладает некоторой автоматической магией, и я считаю, что он добавляет защиту, которую вы описываете по умолчанию (защита от понижения). Следовательно, вы можете переключиться на его использование. Я бы попробовал это первым. Позвольте мне указать основные разметки:
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
AllowDowngrades="no" AllowSameVersionUpgrades="no" />
Помимо удаления элементов обновления старого стиля, не забывайте также удалять любые жестко запрограммированные расписания RemoveExistingProducts
стандартное действие. Например, удалите эту строку (порядковый номер, скорее всего, будет другим, но с тем же именем):
<RemoveExistingProducts Sequence="6550" />
Разъединение: Если вы обнаружите, что существует высокий риск того, что люди будут запускать старые версии и связываться с вашим новейшим приложением, вы можете указать новое место установки и новый код обновления для вашей последней версии и установить их параллельно, чтобы отделить ваши старые и новые продукты.
Параллельно: чтобы это работало, ваш продукт (ы) должен быть способен мирно сосуществовать, а не бороться за файловые ассоциации, зарегистрированные COM-серверы для каждого компьютера или другие глобально распространяемые данные, которые заставляют продукты мешать друг другу, Возможно ли это или нет, зависит от вашего приложения. Глобальный общий COM-сервер не может быть зарегистрирован из двух разных мест - если вы используете обычную регистрацию в реестре (хотя вы можете использовать основанный на манифестах безрегулярный COM - хотя это иногда бывает). Может быть много проблем, которые нужно преодолеть, прежде чем ваше приложение будет поддерживать параллельную установку, или это может быть довольно тривиально, если ваш пакет прост без участия реестра.
Идентификаторы GUID для компонентов: необходимо также установить новые идентификаторы GUID для всех компонентов - в дополнение к упомянутому изменению кода обновления, чтобы реально защитить продукты друг от друга. Если вы используете авто-GUID WiX, это произойдет автоматически. Причина, по которой вам нужны новые идентификаторы GUID компонента, описана здесь: Изменить GUID компонента в wix? По сути, ссылка GUID учитывает абсолютное местоположение установки, а не файл как таковой. Вы устанавливаете на новое место, вам нужен новый GUID компонента.