Обновление Wix переходит в режим обслуживания и никогда не обновляется - PullRequest
0 голосов
/ 10 мая 2018

Я использую 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 ]

0 голосов
/ 11 мая 2018

Журнал показывает, что обновление прошло успешно, установка нового продукта и удаление старого. Наиболее вероятное объяснение двух записей в разделе «Программы и компоненты» состоит в том, что есть одна для реального продукта MSI, а другая - для загрузчика WiX. Возможно, вам нужно подавить MSI с ARPSYSTEMCOMPONENT = 1 или с поддержкой загрузчика WiX для подавления записи MSI.

0 голосов
/ 11 мая 2018

Короткая версия

Множество экземпляров : Я думаю, что многие версии вашего пакета установлены во многих случаях "поверх друг друга" - некоторые из которых скрыты от 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 .


UPDATE

Механизм Culprit : если вы установите автоматический код продукта, каждая сборка сможет быть установлена ​​без отображения режима обслуживания - даже без создания таблицы обновления вообще , Когда вы комбинируете это с сокрытием от «Установка и удаление программ», вы внезапно не можете сказать, какие предыдущие версии были установлены. Дубликаты, установленные поверх друг друга, могут накапливаться при выполнении тестовых установок.

Поскольку кажется, что вы автоматически генерируете код продукта, у вас никогда не должно быть текущей проблемы: режим обслуживания. Это заставляет меня заподозрить проблему с дублированием кода пакета . Или проблема связки, как предложил Фил. У меня слишком мало опыта работы со связками. Может ли это быть ошибкой связки? Или даже ошибка WiX?


Удаление вручную : Возможно, попробуйте использовать VBScript, который вы можете найти здесь, для экспорта списка кодов продуктов MSI, которые в настоящее время установлены в системе (независимо от того, скрыты они или нет): Как найти GUID продукта установленной установки MSI? (внизу, под " Альтернативные инструменты, раздел 3 * 1082" * ".

ОБНОВЛЕНИЕ : см. Ниже встроенную и измененную версию скрипта .

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

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, и вы увидите все настройки рядом друг с другом.
...