На работе мы используем WiX для сборки инсталляционных пакетов. Мы хотим, чтобы установка продукта X привела к удалению предыдущей версии этого продукта на этом компьютере.
Я читал в нескольких местах в Интернете о серьезном обновлении, но не смог заставить его работать. Кто-нибудь может указать, какие именно шаги мне нужно предпринять, чтобы добавить функцию удаления предыдущей версии в WiX?
источник
<MajorUpgrade>
элемент " " должен быть помещен после<Package>
. В противном случаеcandle
выдает следующую ошибку: «ошибка CNDL0107: сбой проверки схемы со следующей ошибкой в строке 1, столбец 473: элемент« Продукт »в пространстве имен» schemas.microsoft.com/wix/2006/wi «имеет недопустимый дочерний элемент» MajorUpgrade 'in namespace' schemas.microsoft.com/wix/2006/wi '. Список возможных ожидаемых элементов:' Package '. ".AllowDowngrades
илиAllowSameVersionUpgrades
. По умолчанию они уже нет.Наконец я нашел решение - я публикую его здесь для других людей, которые могут иметь такую же проблему (все 5 из вас):
Под продуктом добавьте следующее:
Под InstallExecuteSequence добавить:
Отныне всякий раз, когда я устанавливаю продукт, он удаляет предыдущие установленные версии.
Примечание: замените идентификатор обновления на свой собственный GUID
источник
ProductVersion
поддерживает только три поля версий; поэтому четвертое поле не будет сравниваться вообще. См. Примечание под VersionMin и VersionMax в msdn.microsoft.com/en-us/library/aa372379(VS.85).aspxНиже приводится синтаксис, который я использую для крупных обновлений:
Как отметил @Brian Gillespie, существуют другие места для планирования RemoveExistingProducts в зависимости от желаемой оптимизации. Обратите внимание, что PUT-GUID-HERE должен быть идентичен.
источник
<InstallExecute After="RemoveExistingProducts" />
. В вашем примере этого нет - значит ли это, что книга не права?Элемент Upgrade внутри элемента Product в сочетании с правильным планированием действия выполнит удаление, которое вы после. Не забудьте перечислить коды обновления всех продуктов, которые вы хотите удалить.
Обратите внимание, что, если вы будете осторожны с вашими сборками, вы можете предотвратить случайную установку более старой версии вашего продукта поверх более новой. Вот для чего используется поле Maximum. Когда мы собираем установщики, мы устанавливаем UpgradeVersion Maximum для создаваемой версии, но IncludeMaximum = "no", чтобы предотвратить этот сценарий.
У вас есть выбор относительно планирования RemoveExistingProducts. Я предпочитаю планировать его после InstallFinalize (а не после InstallInitialize, как рекомендовали другие):
При этом предыдущая версия продукта остается установленной до тех пор, пока не будут скопированы новые файлы и разделы реестра. Это позволяет мне переносить данные из старой версии в новую (например, вы переключили хранилище пользовательских настроек из реестра в файл XML, но вы хотите быть вежливым и перенести их настройки). Эта миграция выполняется в отложенном настраиваемом действии непосредственно перед InstallFinalize.
Еще одним преимуществом является эффективность: если есть неизмененные файлы, установщик Windows не потрудится копировать их снова, когда вы планируете после InstallFinalize. Если вы планируете после InstallInitialize, предыдущая версия сначала полностью удаляется, а затем устанавливается новая версия. Это приводит к ненужному удалению и повторному копированию файлов.
Другие параметры планирования см. В разделе справки RemoveExistingProducts в MSDN. На этой неделе ссылка: http://msdn.microsoft.com/en-us/library/aa371197.aspx
источник
RemoveExistingProducts
было запланировано послеInstallFinalize
и dll не обновлялись, так как AssemblyVersion не изменилась, но другие поля, такие как AssemblyProduct, были. Я не хочу быть во власти рутины сравнения файлов - я просто хочу , предыдущее приложение GONEВозможно, вам лучше спросить об этом в списке рассылки WiX-пользователей .
WiX лучше всего использовать с четким пониманием того, что делает установщик Windows. Вы можете получить « Полное руководство по установке Windows ».
Действие, которое удаляет существующий продукт, является действием RemoveExistingProducts . Поскольку последствия того, что он делает, зависят от того, где он запланирован, а именно от того, приведет ли сбой к переустановке старого продукта и повторному копированию неизмененных файлов, вы должны запланировать его самостоятельно.
RemoveExistingProducts
обрабатывает<Upgrade>
элементы в текущей установке, сопоставляя@Id
атрибут сUpgradeCode
(указанным в<Product>
элементе) всех установленных продуктов в системе.UpgradeCode
Определяет семейство связанных продуктов. Любые продукты, имеющие этот код 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 , скачал примеры, но у меня все еще было много проблем с обновлениями. Незначительные обновления не выполняют удаление предыдущих продуктов, несмотря на возможность указать их удаление. Я потратил больше одного дня на расследования и обнаружил, что WiX 3.5 ввел новый тег для обновлений. Вот использование:
Но основная причина проблем заключалась в том, что в документации сказано использовать параметры « REINSTALL = ALL REINSTALLMODE = vomus » для небольших и малых обновлений, но при этом не говорится, что эти параметры ЗАПРЕЩЕНЫ для крупных обновлений - они просто перестают работать. Таким образом, вы не должны использовать их с серьезными обновлениями.
источник
Я бы посоветовал взглянуть на учебник Алекса Шевчука. Он объясняет «серьезное обновление» через WiX с помощью хорошего практического примера: « От MSI до WiX, часть 8 - Основное обновление» .
источник
Одна важная вещь, которую я пропустил из учебников некоторое время (украденная у http://www.tramontana.co.hu/wix/lesson4.php ), которая привела к ошибкам «Другая версия этого продукта уже установлена»:
* Небольшие обновления означают небольшие изменения в одном или нескольких файлах, где изменение не гарантирует изменения версии продукта (major.minor.build). Вам также не нужно менять GUID продукта. Обратите внимание, что вы всегда должны изменять GUID пакета при создании нового MSI-файла, который отличается от предыдущих в любом отношении. Установщик отслеживает ваши установленные программы и находит их, когда пользователь хочет изменить или удалить установку, используя эти GUID. Использование одного и того же GUID для разных пакетов может привести к путанице в установщике.
Незначительные обновления означают изменения, когда версия продукта уже изменится. Измените атрибут Version тега Product. Продукт останется прежним, поэтому вам не нужно менять GUID продукта, но, конечно, получить новый GUID пакета.
Основные обновления означают значительные изменения, такие как переход с одной полной версии на другую. Измените все: атрибут версии, идентификатор продукта и пакета.
источник
Я использую последнюю версию WiX (3.0) и не могу заставить работать выше. Но это сработало:
Обратите внимание, что PUT-GUID-HERE должен совпадать с GUID, который вы определили в свойстве UpgradeCode Продукта.
источник
Ниже работал для меня.
Убедитесь, что код обновления в продукте соответствует идентификатору в обновлении.
источник
Это то, что сработало для меня, даже с основным классом ВНИЗ :
источник