WiX "Major Upgrade" не полностью устанавливает приложение при понижении

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

У кого-нибудь есть идеи, почему это происходит?

Мой блок обновления выглядит так:

<UpgradeVersion Minimum="0.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" IgnoreRemoveFailure="yes" />

(IgnoreRemoveFailure была попыткой исправить эту проблему, но, похоже, она ничего не сделала)

В моей InstallExecuteSequence у меня есть <RemoveExistingProducts After="InstallValidate" />

Также у меня есть Product Id="*" а также Package Id="*"

Причина, по которой требуется понижение рейтинга, заключается в том, что клиентское приложение должно работать с той же версией, что и сервер, для обеспечения совместимости, и весь процесс должен быть автоматизирован, поэтому, если версии клиент / сервер не совпадают при входе, пользователь может просто нажмите "да", и соответствующая версия будет загружена, установлена ​​и запущена. Пока что это работает для обновлений, но для понижения необходим дополнительный неинтуитивный шаг, который заключается в том, чтобы вручную перезапустить приложение, а затем увидеть диалоговое окно установщика Windows перед его запуском.

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

5 ответов

Вот что сработало для меня:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />

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

Если вам нужно, чтобы это работало, есть ли что-нибудь в подробном журнале для более ранней установки (или для ремонта - вам нужно установить политику ведения журнала машины, чтобы создать этот), который подтверждает основное обновление (я бы посмотрите рядом с FindRelatedProducts) или обсуждает, почему компонент для вашего exe не установлен? Обязательно проверьте наличие любых строк журнала с SELMGR как они могли бы объяснить это в незначительном сценарии обновления.

Поскольку рекламируемый ярлык на месте, кажется, что компонент был объявлен вместо этого. Это может указывать на нарушения правил компонентов при незначительном обновлении (в частности, добавление компонента в более новой версии, похожее на удаление в более старой версии - см. Комментарий HeathS), хотя это выглядит как Product/@Id='*' должен заставить серьезное обновление.

Вы также можете попробовать работать в примере проекта, начиная с базовой версии, которая имеет одну функцию, один компонент и один файл с ярлыком. При необходимости добавьте еще один компонент и файл в обновленную версию; в противном случае просто увеличивайте версии файла. Тогда попробуйте свой обратный сценарий. Медленно добавляйте вещи, пока не найдете своего виновника. Тогда надейтесь, что это то, что вы можете удалить из своего реального продукта, или иначе можно обойти.

Мое предложение немного относится к принципу "заставь его работать" - в случае понижения версии можно попробовать выполнить пользовательское действие по тихому восстановлению.

Как вы упорядочили операции в вашей InstallExecuteSequence?

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

Установщик Windows не будет перезаписывать более старые версии новыми, если это явно не задано.

Изменение порядка удаления перед установкой должно помочь, если это так.

Что произойдет, если вы используете два элемента "UpgradeVersion"?

<UpgradeVersion Maximum="CurrentVersion" Property="PREVIOUSVERSIONSINSTALLED" IncludeMaximum="no" />
<UpgradeVersion Minimum="CurrentVersion" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="no" />
Другие вопросы по тегам