WIX не удаляет старую версию
После некоторого поиска в Google я придумал конфигурацию, которая позволила бы мне устанавливать только более новые версии моего пакета (что он делает), заменяя старые, уже установленные версии (которые это не делает)
Мой файл wxs выглядит следующим образом:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="Gdml File Viewer" Language="1033"
UpgradeCode="5fb07c15-32a5-4b8a-9794-e4425bfc2eea"
...>
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine" Platform="x64" />
<MajorUpgrade Schedule="afterInstallValidate"
DowngradeErrorMessage="A later version of [ProductName] is already installed"
AllowSameVersionUpgrades="no"
AllowDowngrades="no" />
...
Как и ожидалось, это позволяет мне устанавливать более новые версии, но более старая версия не удаляется. Он по-прежнему отображается в списке "Приложения и функции":
(Другой экземпляр имеет версию 2019.14.181.35181)
1 ответ
Не удалось выполнить крупное обновление: когда вы видите две записи в разделе "Установка и удаление программ", ваше основное обновление завершилось неудачно (как правило). Вам необходимо исправить конфигурацию таблицы обновлений. Смотрите вероятные причины, перечисленные ниже.
Минимальная разметка WiX: минимальная разметка WiX для таблицы обновления по умолчанию - с обычными параметрами (которая работает нормально, см. Скриншот ниже) - просто:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Дополнительно: даже возможно объединить вышеуказанный "элемент удобства" для простой основной конфигурации обновления с элементами старого стиля для полного контроля над содержимым таблицы обновления. Образцы здесь.
Вероятные причины: краткое изложение некоторых из многих возможных причин неудачных крупных обновлений.
Несоответствующий код обновления: возможно, в кодах обновления между старой и новой версией MSI может быть несоответствие, поэтому продукты не определены как связанные. Это должно оставить две версии после установки (удаление старой версии никогда не происходило).
Отсутствует код обновления. Просто добавьте, что код обновления может отсутствовать.
ProductVersion: возможно, не было повышения одной или нескольких первых трех цифр в версии продукта (четвертое поле игнорируется).
Код продукта: В качестве дополнительного примечания вы можете получить предупреждение о том, что продукт уже установлен, это означает, что код продукта НЕ изменился (что необходимо для серьезного обновления).
Повисшая версия: также возможно, что ваша разметка WiX в порядке, и у вас есть висящая более старая версия, которая никогда не была правильно настроена, если это так, удалите ее вручную и попробуйте снова или попробуйте чистый виртуальный.
Контекст установки: файлы MSI могут быть установлены для каждого пользователя или компьютера. Если у вас есть установка для пользователя, а затем запустите установку для компьютера, она не обнаружит предыдущую версию. Есть ли у вас какие-либо жесткие ссылки на ALLUSERS в вашей упаковке?
SecureCustomProperties: Быстро - хотя я помню - в безопасных средах (корпоративные среды с пользователями, работающими без прав администратора) вам необходимо добавить свойство ACTION из таблицы обновлений в список безопасных свойств (свойства, которые можно передавать в отложенный режим).
Код пакета: очень особый случай, который я видел, когда новый пакет имеет тот же код пакета, что и старый (или существующий установленный пакет). Это крайняя ошибка проектирования, которая не должна возникать. Всегда автоматически генерируйте код пакета, это правильный путь. Установщик Windows будет рассматривать два пакета как идентичные по определению (в отличие от фактического факта).
Дополнительные детали: некоторые дополнительные вещи, которые нужно помнить:
Основное обновление - это, по сути, удаление старой версии и установка новой версии с рядом параметров планирования для порядка, в котором выполняются действия (сначала установите новую, а затем удалите старую или наоборот).
Как указывалось выше, вы также можете иметь устаревшую версию установки на коробке, которая не была должным образом сконфигурирована, или произошла какая-то ерунда X-Files, которая предупреждает об отказе при обновлении. Случается.
В отличие от WiX, это маловероятно, но стандартное действие RemoveExistingProducts может отсутствовать в InstallExecuteSequence.
Кривая обучения WiX: Предложите использовать несколько примеров, чтобы ускорить процесс обучения. Единственное, что действительно помогает? Вот несколько советов по быстрому запуску WiX. Там есть примеры ссылок.
Образец минимального WiX: есть этот старый образец: прозрачный алюминий. По сути, пошаговое руководство по использованию Votive для создания установщика на основе WiX. Включает основной элемент обновления. Я считаю, что эта простая конфигурация добавляет защиту от понижения, к которому вы стремитесь:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Смотрите таблицу обновлений, которая приводит:
Тестовый пример: Используя прозрачный алюминий в качестве тестового проекта, вы можете попробовать эту процедуру, чтобы заставить обновление работать:
- Установите код продукта на
*
для того, чтобы автоматически генерировать новый код продукта для каждой сборки ("<Product Id="*" ..."
). - Скомпилируйте первую версию вашего MSI. Щелкните правой кнопкой мыши проект WiX в представлении решения в
Visual Studio
и выберитеOpen Folder in File Explorer
, Вbin
а такжеDebug
или жеRelease
, - Переименуйте скомпилированный MSI, добавив _1 в конец имени файла. Например: MySetup_1.msi
- Теперь поднимите одну из первых 3 цифр поля версии продукта в источнике WiX:
<Product Id="*" ... Version="2.0.0"
- Скомпилируйте новый MSI и переименуйте его: MySetup_2.msi
- Установите файлы MSI, начиная с версии 1, а затем второй. Убедитесь, что основное обновление прошло успешно.
Дополнительно: вот демонстрация усовершенствованного способа настройки основных обновлений с использованием комбинации элемента удобства "MajorUpgrade"
и старше "Upgrade"
элементы (которые позволяют более детально контролировать итоговую таблицу обновлений):
Добавление записей в MSI UpgradeTable для удаления связанных продуктов
И вот пример использования только старых элементов Upgrade, что приводит к большей работе, но полный контроль над таблицей Upgrade: Major Upgrade - "The Old, Manual Way".
Ссылки:
- При выполнении Major Upgrade в Wix создается 2 записи в разделе "Установка и удаление программ".
- Обновление сгенерированного пакета WiX с основной нулевой версией
- Невозможно удалить предыдущие версии MSI. Несколько записей отображаются на панели управления
- Добавление записей в MSI UpgradeTable для удаления связанных продуктов