Добавление записей в MSI UpgradeTable для удаления связанных продуктов
У узла продукта установщика WiX есть атрибут UpgradeCode. Он используется для обозначения предыдущих версий того же продукта. Значение хранится в UpgradeTable. Таблица UpgradeTable анализируется действием FindRelatedProducts.
UpgradeCode
позволяет удалить предыдущие продукты с тем же UpgradeCode
, Но план состоит в том, чтобы объединить несколько устаревших продуктов в единый продукт. UpgradeCode
об этом унаследованном продукте известно. Я надеюсь, что добавление этого кода в таблицу UpgardeTable также удалит этот устаревший продукт. это можно сделать, заполнив таблицу обновлений.
Как я могу добавить больше записей в UpgradeTable в настройках WiX?
Изменить: какой синтаксис требуется?
Есть ли лучший способ удалить устаревшие продукты после обновления?
2 ответа
Краткий ответ: Вы добавляете несколько записей элемента обновления в исходный код WiX, которые создадут несколько строк в скомпилированной таблице обновлений MSI, которые затем перечисляют продукты, которые должны быть удалены во время установки (или которые могут прервать установку). Вы должны быть очень осторожны с параметрами, указанными для каждого семейства продуктов для удаления.
Параллельная установка. Помните, что альтернатива удалению старых версий во время крупного обновления заключается в том, чтобы сделать новую версию достаточно изолированной, чтобы иметь возможность сосуществовать с существующими установками. Такая изоляция может быть сложной и представляет собой совершенно другую игру (не допускать: борьба за ассоциации файлов, несовместимые установки COM-серверов, несовместимые среды выполнения, конфликтующие службы, неожиданные блокировки файлов конфигурации и разделов реестра и т. Д.).
Элемент MajorUpgrade. В более новых версиях WiX имеется "удобная функция" для реализации основных обновлений в форме элемента MajorUpgrade. Эти элементы упрощают реализацию обычных крупных обновлений.
Элемент обновления. В более ранних версиях WiX для реализации основных обновлений приходилось использовать больше базовых элементов. Этот элемент все еще доступен, и это то, что вам нужно для более сложной и детальной конфигурации UpgradeTable.
Различия между использованием этих методов очень хорошо проиллюстрированы Вимом Коененом здесь: Majorupgrade или Upgrade ID, который предпочтителен для Major upgrade? Я думаю, что это объяснение настолько хорошо, что я отказываюсь повторять это слишком много здесь:-). Прочитайте это, пожалуйста.
Основные варианты конфигурации обновления: ниже приведен только пример. Фактическая конфигурация крупного обновления должна быть тщательно продумана в каждом случае:
- Вы хотите прервать работу, если найдены более высокие версии?
- Из какой продуктовой линейки?
- Каким будет сообщение об ошибке?
- Хотите продолжить, если удаление старой версии завершится неудачно?
- Вы хотите разрешить более низким версиям удалить более высокую версию? (пожалуйста, не надо).
- Вы хотите разрешить той же версии удалить себя и переустановить?
Вы, очевидно, должны планировать это и тестировать подробно. Ниже приведен макет. Это сочетает в себе использование элементов MajorUpgrade и Upgrade. Вы также можете полагаться исключительно на элементы Upgrade, чтобы делать вещи "вручную" с более точным контролем:
<!-- Major upgrade - Your New Product Line, using the MajorUpgrade convenience element -->
<MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed" />
<!-- Older Product Line 1: Upgrade Code -->
<Upgrade Id="{11111111-1111-1111-1111-000000000000}">
<UpgradeVersion Property="PRODUCTLINE1" IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>
<!-- Older Product Line 2: Upgrade Code -->
<Upgrade Id="{22222222-2222-2222-2222-000000000000}">
<UpgradeVersion Property="PRODUCTLINE2" IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>
<!-- Older Product Line 3: Upgrade Code -->
<Upgrade Id="{33333333-3333-3333-3333-000000000000}">
<UpgradeVersion Property="PRODUCTLINE3" IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>
Я бы посоветовал вам изменить название этих свойств PRODUCTLINE, которое по своей сути понятно как конкретная линейка продуктов. Другими словами, если вы удаляете WiX3, вы называете его WIX3PRODUCTLINE и т. Д.... Это облегчает понимание полученного файла журнала.
Пример таблицы обновлений:
Столбец Атрибуты таблицы обновлений важен для управления поведением основного обновления. Продолжить удаление, и т. Д.
И список бесплатных инструментов, которые вы можете использовать для просмотра скомпилированных файлов MSI (для тех, кто может найти этот ответ): Как я могу сравнить содержимое двух (или более) файлов MSI?
Некоторые ссылки:
- Как я могу найти код обновления для установленного файла MSI?
- Как я могу найти GUID продукта установленной установки MSI?
- Как выполнить серьезное обновление в вашем установщике
- Majorupgrade или Upgrade ID, который является предпочтительным для Major upgrade?
- Основные обновления теперь проще, чем когда-либо
Также хочу отправить вас на сайт эксперта по WiX Нила Слайтхолма для некоторых устаревших, но все же хороших образцов реального мира:
Просто добавьте элементы Upgrade и UpgradeVersion по мере необходимости. Это все просто работает. Возможно, вы используете элемент MajorUpgrade, и, возможно, вы не знаете об этих других элементах.