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



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



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

1000   12  

12 ответов:

в последних версиях (от 3.5.1315.0 бета), вы можете использовать MajorUpgrade элемент вместо того, чтобы использовать свои собственные.

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

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

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

  • измените идентификатор продукта на *
  • В разделе продукт добавить следующее:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • В разделе InstallExecuteSequence добавить:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

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

Примечание: заменить обновление Id с вашим собственным GUID

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

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

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

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

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

обратите внимание, что если вы будете осторожны с вашими сборками, вы можете предотвратить случайную установку более старой версии вашего продукта поверх более новой. Вот для чего нужно максимальное поле. Когда мы строим установщики, мы устанавливаем максимум UpgradeVersion к версия строится, но IncludeMaximum="нет", чтобы предотвратить этот сценарий.

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

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

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

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

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

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

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

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

RemoveExistingProducts процессы <Upgrade> элементы в текущей установки, соответствующие до UpgradeCode (указанный в <Product> элемент) всех установленных продуктов в системе. Элемент UpgradeCode определяет семейство сопутствующих товаров. Любые продукты, которые имеют этот UpgradeCode, чьи версии попадают в указанный диапазон, и где и no (или опущен), будет удален.

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

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

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

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

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

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

другой сайт, который был очень полезным был этот:

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

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

<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." AllowDowngrades="no" />

но главная причина из проблем было то, что документация говорит, чтобы использовать " ПЕРЕУСТАНОВИТЬ=ВСЕ REINSTALLMODE=vomus" параметры для незначительных и небольших обновлений, но это не говорит, что эти параметры запрещено для крупных обновлений - они просто перестают работать. Поэтому вы не должны использовать их с крупными обновлениями.

Я бы предложил взглянуть на учебник Алексея Шевчука. Он объясняет "крупное обновление" через WiX с хорошим практическим примером в от MSI до WiX, Часть 8-основное обновление.

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

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

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

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

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

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

обратите внимание, что говоря-идентификатор-здесь должен быть таким же, как идентификатор GUID, который вы определили в собственность UpgradeCode продукта.

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

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

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

Это то, что сработало для меня, даже с майором вниз класс:

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

Comments

    Ничего не найдено.