Как запретить 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>

Дальнейшие действия:
После предложения Штейнса у меня возникла такая ошибка:
«Обнаружен повторяющийся символ WixAction: InstallExecuteSequence / RemoveExistingProducts»
После просмотра файла Product.wxs под <InstallExecuteSequence> мне пришлось удалить <RemoveExistingProducts Sequence="6550" /> потому что это был дубликат, о котором говорилось. После этого установщик заработал, и старые версии больше не могут быть установлены поверх новых.


person WWZee    schedule 27.06.2018    source источник
comment
Да, я должен был указать на это. Этот элемент MajorUpgrade добавляет вещи, которые вы не должны дублировать. Есть несколько таких причуд, о которых следует знать и по другим вопросам. Если бы я мог подумать о них прямо сейчас. Полагаю, мне стоит обновить ответ ... Обновился.   -  person Stein Åsmul    schedule 28.06.2018


Ответы (1)


Прошлые будущие пакеты: вы не можете изменять старые версии своего пакета для обнаружения более новых. Вам необходимо с самого начала встроить защиту в свои пакеты. Packages need to be pre-cognitive. It's an industry problem.

Современность: элементы 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 компонента.

person Stein Åsmul    schedule 28.06.2018