Добавление записей в 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?


Некоторые ссылки:

Также хочу отправить вас на сайт эксперта по WiX Нила Слайтхолма для некоторых устаревших, но все же хороших образцов реального мира:

Просто добавьте элементы Upgrade и UpgradeVersion по мере необходимости. Это все просто работает. Возможно, вы используете элемент MajorUpgrade, и, возможно, вы не знаете об этих других элементах.

Другие вопросы по тегам