Как реализовать обновление установщика WiX?

На работе мы используем WiX для создания инсталляционных пакетов. Мы хотим, чтобы установка продукта X привела к удалению предыдущей версии этого продукта на этом компьютере.

Я прочитал несколько мест в Интернете о серьезном обновлении, но не смог заставить его работать. Может кто-нибудь указать конкретные шаги, которые мне нужно предпринять, чтобы добавить функцию удаления предыдущей версии в WiX?

В новейших версиях (из бета-версии 3.5.1315.0) вы можете использовать элемент MajorUpgrade вместо использования своих собственных.

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

 

Наконец, я нашел решение – я размещаю его здесь для других людей, у которых может быть одна и та же проблема (все пять из вас):

  • Измените идентификатор продукта на *
  • Под добавлением продукта:

         
  • В разделе InstallExecuteSequence добавьте:

      

С этого момента всякий раз, когда я устанавливаю продукт, он удаляет предыдущие установленные версии.

Примечание: замените идентификатор обновления собственным GUID

Ниже приведен тип синтаксиса, который я использую для основных обновлений:

         

Поскольку @Brian Gillespie отметил, что есть другие места для планирования RemoveExistingProducts в зависимости от желаемых оптимизаций. Обратите внимание, что PUT-GUID-ЗДЕСЬ должен быть идентичным.

Элемент Upgrade внутри элемента Product, в сочетании с надлежащим планированием действия, выполнит удаление, которое вы выполните. Обязательно укажите коды обновления всех продуктов, которые вы хотите удалить.

     

Обратите внимание: если вы будете осторожны с вашими assemblyми, вы можете помешать людям случайно установить более старую версию вашего продукта на более новую. Для этого используется поле Maximum. Когда мы создаем инсталляторы, мы устанавливаем UpgradeVersion Maximum в построенную версию, но IncludeMaximum = “no”, чтобы предотвратить этот сценарий.

У вас есть выбор в отношении планирования RemoveExistingProducts. Я предпочитаю планировать его после InstallFinalize (а не после InstallInitialize, как рекомендовали другие):

    

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

Другим преимуществом является эффективность: если есть неизменные файлы, установщик Windows не беспокоится о повторном копировании их при планировании после InstallFinalize. Если вы планируете после InstallInitialize, предыдущая версия полностью удаляется сначала, а затем устанавливается новая версия. Это приводит к ненужному удалению и повторному копированию файлов.

Другие параметры планирования см. В разделе справки RemoveExistingProducts в MSDN. На этой неделе ссылка: http://msdn.microsoft.com/en-us/library/aa371197.aspx

Возможно, вам лучше спросить об этом в списке рассылки WiX-пользователей .

WiX лучше всего использовать с четким пониманием того, что делает установщик Windows. Вы можете подумать о получении « Окончательного руководства к установщику Windows ».

Действие, которое удаляет существующий продукт, – это действие RemoveExistingProducts . Поскольку последствия того, что он делает, зависит от того, где это запланировано, а именно, является ли отказ причиной переустановки старого продукта и повторяются ли неизменные файлы снова – вы должны сами планировать его.

RemoveExistingProducts обрабатывает элементы в текущей установке, сопоставляя атрибут @Id с UpgradeCode (указанным в элементе ) всех установленных продуктов в системе. Код UpgradeCode определяет семейство связанных продуктов. Любые продукты, имеющие этот UpgradeCode, чьи версии попадают в указанный диапазон и где UpgradeVersion/@OnlyDetect no (или опущен), будут удалены.

В документации для RemoveExistingProducts упоминается настройка свойства RemoveExistingProducts . Это означает, что процесс удаления для удаляемого продукта получает это свойство, значение которого является Product/@Id для устанавливаемого продукта.

Если ваша первоначальная установка не включала UpgradeCode , вы не сможете использовать эту функцию.

Я использовал этот сайт, чтобы помочь мне понять основы обновления WiX:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

Впоследствии я создал образец установщика (установил тестовый файл), а затем создал установщик Upgrade (установил 2 образца тестовых файлов). Это даст вам общее представление о том, как работает механизм.

И, как сказал Майк в книге от Apress, «Окончательное руководство к установщику Windows», это поможет вам понять, но не написано с использованием WiX.

Еще один сайт, который был очень полезен, был следующим:

http://www.wixwiki.com/index.php?title=Main_Page

Я прочитал документацию WiX , загрузил примеры, но у меня все еще было много проблем с обновлениями. Незначительные обновления не выполняют удаление предыдущих продуктов, несмотря на возможность указать их удаление. Я потратил больше времени на исследования и обнаружил, что WiX 3.5 предлагает новый тег для обновлений. Вот использование:

  

Но основная причина проблем заключалась в том, что документация говорит о том, что для параметра « REINSTALL = ALL REINSTALLMODE = vomus » для незначительных и малых обновлений используется документация, но она не говорит, что эти параметры FORBIDDEN для крупных обновлений – они просто перестают работать. Поэтому вы не должны использовать их с основными обновлениями.

Я бы посоветовал взглянуть на учебник Алекса Шевчука. Он объясняет «серьезную модернизацию» через WiX с хорошим практическим примером на от MSI до WiX, часть 8 – Major Upgrade .

Одна важная вещь, которую я пропустил из учебников некоторое время (украденный с http://www.tramontana.co.hu/wix/lesson4.php ), в результате чего были исправлены ошибки «Другая версия этого продукта»:

* Небольшие обновления означают небольшие изменения в одном или нескольких файлах, где изменение не гарантирует изменения версии продукта (major.minor.build). Вам также не нужно менять GUID продукта. Обратите внимание, что вам всегда нужно менять GUID пакета при создании нового .msi-файла, который в любом случае отличается от предыдущих. Установщик отслеживает ваши установленные программы и находит их, когда пользователь хочет изменить или удалить установку с помощью этих GUID. Использование одного и того же GUID для разных пакетов приведет к запутыванию установщика.

Незначительные обновления означают изменения, когда версия продукта уже изменится. Измените атрибут Version тега Product. Продукт останется прежним, поэтому вам не нужно менять GUID продукта, но, конечно же, получить новый GUID пакета.

Основные обновления означают значительные изменения, например, переход от одной полной версии к другой. Изменить все: атрибут версии, GUID продукта и пакета.

Я использую последнюю версию WiX (3.0) и не могу заставить работу выше. Но это работало:

     

Обратите внимание, что PUT-GUID-HERE должен совпадать с GUID, который вы определили в свойстве UpgradeCode продукта.

Ниже работал для меня.

         

Убедитесь, что UpgradeCode в продукте соответствует Id в обновлении.

Это то, что сработало для меня, даже с основным classом DOWN :

     
Давайте будем гением компьютера.