Обновление Wix переходит в режим обслуживания и никогда не обновляется
Я использую Wix 3.11.1, и при попытке выполнить обновление обновление переходит в режим обслуживания и оставляет две записи в списке "Установка и удаление программ".
Короткая версия Product.wxs имеет следующее:
<Product Id="*" Name="Boo" Language="1033" Version="1.1.0.0" Manufacturer="Foo"
UpgradeCode="PUT-GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/>
<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="!(loc.NewerVersionInstalled)" />
Код обновления: 3F55CE54-8409-4918-9906-D8AD18794BFC
И код продукта и упаковки:
1,0
Код продукта FC49F622-02E6-40D9-ACD9-92BDD4AF5979
Код упаковки 6C49FAA1-5B11-4173-80A7-A7B3FA4313AE
1,1
Код продукта 4871555F-F369-4159-9EF0-4BBDF07B6842
Код упаковки 3594D7C2-D5AC-4A41-A8C6-6E3D63C6ACA0
Когда я запускаю установщик с ведением журнала, я получаю информацию журнала, показанную ниже. Когда код обновления одинаков, коды продуктов и пакетов различны, а версия увеличивается на первые три цифры, я думал, что обновление должно произойти, но это не так. Также обе версии предназначены для каждой машины, поэтому не следует останавливать удаление предыдущей версии. Журнал показывает режим обслуживания и никогда не выполняет удаление предыдущей версии. У меня есть таблица обновления в MSI, и она показывает максимальное значение 1,1 и WIX_UPGRADE_DETECTED в качестве действия. Кто-нибудь знает, что может привести к переходу в режим обслуживания, а не сделать серьезное обновление?
MSI (s) (68:9C) [15:04:38:423]: Doing action: RemoveExistingProducts
Action 15:04:38: RemoveExistingProducts. Removing applications
Action start 15:04:38: RemoveExistingProducts.
RemoveExistingProducts: Application: {FC49F622-02E6-40D9-ACD9-92BDD4AF5979}, Command line: UPGRADINGPRODUCTCODE={4871555F-F369-4159-9EF0-4BBDF07B6842} CLIENTPROCESSID=8344 CLIENTUILEVEL=0 MSICLIENTUSESEXTERNALUI=1 REMOVE=ALL
MSI (s) (68:BC) [15:04:38:423]: Resetting cached policy values
MSI (s) (68:BC) [15:04:38:423]: Machine policy value 'Debug' is 0
MSI (s) (68:BC) [15:04:38:423]: ******* RunEngine:
******* Product: {FC49F622-02E6-40D9-ACD9-92BDD4AF5979}
******* Action:
******* CommandLine: **********
MSI (s) (68:BC) [15:04:38:423]: Note: 1: 2203 2: C:\WINDOWS\Installer\inprogressinstallinfo.ipi 3: -2147287038
MSI (s) (68:BC) [15:04:38:423]: Machine policy value 'LimitSystemRestoreCheckpointing' is 0
MSI (s) (68:BC) [15:04:38:423]: Note: 1: 1717 2: Boo
MSI (s) (68:BC) [15:04:38:423]: Calling SRSetRestorePoint API. dwRestorePtType: 1, dwEventType: 102, llSequenceNumber: 0, szDescription: "Removed Boo".
MSI (s) (68:BC) [15:04:38:439]: The call to SRSetRestorePoint API succeeded. Returned status: 0, llSequenceNumber: 45.
MSI (s) (68:BC) [15:04:38:439]: End dialog not enabled
MSI (s) (68:BC) [15:04:38:439]: Original package ==> C:\WINDOWS\Installer\1179bb4.msi
MSI (s) (68:BC) [15:04:38:439]: Package we're running from ==> C:\WINDOWS\Installer\1179bb4.msi
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall Flags override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall VersionNT override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall ServicePackLevel override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: looking for appcompat database entry with ProductCode '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisablePatch' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'AllowLockdownPatch' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisableLUAPatching' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisableFlyWeightPatching' is 0
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: looking for appcompat database entry with ProductCode '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (68:BC) [15:04:38:439]: Transforms are not secure.
MSI (s) (68:BC) [15:04:38:439]: Command Line: UPGRADINGPRODUCTCODE={4871555F-F369-4159-9EF0-4BBDF07B6842} CLIENTPROCESSID=8344 CLIENTUILEVEL=0 MSICLIENTUSESEXTERNALUI=1 REMOVE=ALL
MSI (s) (68:BC) [15:04:38:439]: PROPERTY CHANGE: Adding PackageCode property. Its value is '{6C49FAA1-5B11-4173-80A7-A7B3FA4313AE}'.
MSI (s) (68:BC) [15:04:38:439]: Product Code passed to Engine.Initialize: '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product Code from property table before transforms: '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product Code from property table after transforms: '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product registered: entering maintenance mode
Обновить:
Это действительно пакетная установка. Я посмотрел на msi как на виновника, потому что думал, что пакет Wix будет использовать msiexec для выполнения удаления.
В нашей сборке мы используем поисковый термин "0.0.0.0" для версии в комплекте и msi, затем делаем замену на правильную версию, и в конце сборки мы возвращаем Bundle.wxs и Product.wxs.
Когда установщик работает над разработчиком, он должен закомментировать возвращение в файле сборки, чтобы работать с файлами. Когда разработчик закончит, им нужно установить версию обратно на 0.0.0.0. В одной из проверок установщика кто-то должен был забыть изменить обратно на "0.0.0.0".
Я попробовал msi для двух версий самостоятельно, и обновление действительно удаляло запись для первоначальной установки. Однако обновление пакета все еще оставляет вторую запись, даже если версия верна.
2 ответа
Журнал показывает, что обновление прошло успешно, установка нового продукта и удаление старого. Наиболее вероятное объяснение этих двух записей в разделе "Программы и компоненты" заключается в том, что есть одна для реального продукта MSI, а другая - для загрузчика WiX. Возможно, вам нужно подавить MSI с ARPSYSTEMCOMPONENT=1 или с поддержкой загрузчика WiX для подавления записи MSI.
Укороченная версия
Множество экземпляров: я думаю, что многие версии вашего пакета установлены во многих случаях "друг на друга", некоторые из которых скрыты от Add / Remove Programs
из-за ARPSYSTEMCOMPONENT=1
настройка указывается в (некоторых) пакетах. Один из установленных экземпляров имеет тот же код продукта, что и пакет, который вы пытаетесь установить - это запускает режим обслуживания - поскольку код продукта уже зарегистрирован как установленный.
Код путаницы? Также возможно, что вы установили две или более версии одного и того же MSI с одинаковыми кодами пакетов (в отличие от кодов продуктов). Это всегда вызывает загадочные проблемы - например, проблема, с которой вы сталкиваетесь в режиме обслуживания (идентичные идентификаторы GUID означают, что два разных файла MSI по определению будут рассматриваться как один и тот же файл - поскольку идентификаторы GUID одинаковы) X-Files msiexec.exe
идет за вашей спиной и запускается из старого, кэшированного MSI, а не вашего нового MSI).
Bundle? Фил пишет, что это может быть и проблема связки WiX. Возможно, попробуйте сначала выполнить скрипт внизу, чтобы получить полный список того, что установлено - скрыто от просмотра или нет.
Подробная версия
Возможная причина: кажется, вы настраиваете ARPSYSTEMCOMPONENT = 1
который будет скрывать настройки из "Установка и удаление программ" (ARP). Насколько я вижу, в журнале есть множество кодов упаковки и продуктов, которые не совпадают с теми, которые вы указали в своем вопросе. Кажется, в системе может быть установлено несколько более старых тестовых версий, которые также могут быть скрыты от ARP, но все еще установлены на коробке. Не знаете, почему вы говорите, что текущая версия отображается в ARP? С установленным ARPSYSTEMCOMPONENT он не должен этого делать.
Виртуалы: как всегда гласит девиз: тестируйте виртуалы, когда вы видите странные проблемы - чтобы определить, есть ли у вас грязная тестовая среда. Тестирование виртуальных компьютеров крайне важно для меня, но я часто делаю это слишком поздно.
MSDN: ARPSYSTEMCOMPONENT.
ОБНОВЛЕНИЕ:
Механизм Culprit: Когда вы устанавливаете код продукта для автоматической генерации, каждая сборка сможет быть установлена без отображения режима обслуживания - даже без создания таблицы обновления вообще. Когда вы комбинируете это с сокрытием от "Установка и удаление программ", вы внезапно не можете сказать, какие предыдущие версии были установлены. Дубликаты, установленные поверх друг друга, могут накапливаться во время тестовой установки.
Поскольку кажется, что вы автоматически генерируете код продукта, у вас никогда не должно быть текущей проблемы: режим обслуживания. Это заставляет меня подозревать проблему дублирования кода пакета. Или проблема связки, как предложил Фил. У меня слишком мало опыта работы со связками. Может ли это быть ошибка пакета? Или даже ошибка WiX?
Удаление вручную: возможно, попробуйте использовать VBScript, который вы можете найти здесь, для экспорта списка кодов продуктов MSI, которые в настоящее время установлены в системе (скрыты они или нет): Как я могу найти GUID продукта установленной установки MSI? (внизу, под " Альтернативными инструментами, раздел 3 " ,
ОБНОВЛЕНИЕ: см. Ниже встроенную и измененную версию скрипта.
Получив список, попробуйте удалить нежелательные тестовые пакеты, используя:
msiexec.exe /x [ProductCode]
продолжайте удаление, пока у вас не появится "чистая коробка".
Основное обновление с распространением полной версии. Кроме того, вы можете установить широкий диапазон версий (минимальная / максимальная версия) для своей таблицы обновлений, чтобы посмотреть, сможете ли вы удалить все существующие версии с помощью регулярного основного обновления. Честно говоря, я никогда не тратил время на тестирование удаления нескольких предыдущих версий с помощью значительных обновлений, но, насколько я знаю, это должно работать. NB!: Я не думаю, что это будет работать, если у вас есть дублирование кода пакета.
Удаление связанных продуктов: еще один ответ, показывающий, как удалить все продукты, использующие один и тот же код обновления. Обратите внимание на отказ от ответственности за автоматическую перезагрузку при запуске в автоматическом режиме: Powershell: удаление приложения с помощью UpgradeCode.
Удаление по названию продукта: И менее разумно, но я просто добавлю ссылку для безопасного хранения. Вот как вы можете удалить пакет MSI по имени продукта: Есть ли альтернатива GUID при использовании msiexec для удаления приложения?
Список всех установленных продуктов MSI
ОБНОВЛЕНИЕ: если подумать, позвольте мне встроить приведенный выше скрипт с парой дополнений - это добавляет заголовки, код издателя и кода пакета к экспорту. Этот сценарий должен отображать все установленные пакеты, в том числе скрытые из программы "Установка и удаление программ" (если вам также нужен код обновления, тогда это немного сложнее по техническим причинам, вот описание того, как это можно сделать неуклюже - эта ссылка в свою очередь содержит дополнительные ссылки для получения кодов обновления с помощью Powershell):
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
output.writeline ("Product Code,Product Name,Product Version,Package Code, Publisher")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
packagecode=product.InstallProperty("PackageCode")
publisher=product.InstallProperty("Publisher")
output.writeline (productcode & ", " & name & ", " & version & ", " & packagecode & ", " & publisher)
Next
output.Close
Использование:
- Скопируйте скрипт и вставьте его в файл *.vbs на рабочем столе и попробуйте запустить его, дважды щелкнув. Ваш рабочий стол должен быть записан для вас, или вы можете использовать любое другое место для записи.
- Выходной файл создается в папке, из которой вы запускаете скрипт (папка должна быть доступна для записи). Выходной файл называется
msiinfo.csv
, - Дважды щелкните файл, чтобы открыть его в приложении для работы с электронными таблицами, выберите запятую в качестве разделителя при импорте - ИЛИ - просто откройте файл в Блокноте или любом средстве просмотра текста.
- Содержимое в электронной таблице должно быть отформатировано в столбцах, если не открыть файл вручную и импортировать файл, выбрав запятую в качестве разделителя для файла CSV (значения, разделенные запятыми). Это обеспечит полные возможности работы с электронными таблицами, такие как сортировка по столбцам, например, Publisher, и вы увидите все настройки рядом друг с другом.