Вопрос

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

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

Это было полезно?

Решение

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

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

<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" /> 
    

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

Примечание: замените идентификатор обновления своим собственным 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, есть другие места для планирования удаления существующих продуктов в зависимости от желаемой оптимизации.Обратите внимание, что PUT-GUID-HERE должен быть идентичным.

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

<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="no", чтобы предотвратить этот сценарий.

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

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

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

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

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

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

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

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

RemoveExistingProducts процессы <Upgrade> элементы в текущей установке, соответствующие @Id атрибут для UpgradeCode (указано в <Product> элемент) всех установленных продуктов в системе.Тот Самый UpgradeCode определяет семейство сопутствующих продуктов.Любые продукты, которые имеют этот код обновления, версии которых попадают в указанный диапазон и где UpgradeVersion/@OnlyDetect атрибут - это 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 3.5 добавлен новый тег для обновлений.Вот как это используется:

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

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

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

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

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

Незначительные обновления обозначьте изменения там, где версия продукта уже изменится.Измените атрибут Version тега Product. Измените атрибут Version тега Product.Продукт останется прежним, поэтому вам не нужно менять 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>

Обратите внимание, что PUT-GUID-HERE должен совпадать с 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>

Пожалуйста, убедитесь, что код обновления в продукте совпадает с идентификатором в Обновлении.

Это то, что сработало у меня, даже с майором ВНИЗ класс:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top