WiX – пытаюсь выяснить последовательность установки

StackOverflow https://stackoverflow.com/questions/778210

Вопрос

Я устанавливаю большое приложение, и часть его представляет собой специально написанный инструмент под названием «DbUpdateManager» для массового выполнения SQL-скриптов в нашей целевой базе данных.

На данный момент установка WiX 2.x работает, но у нее есть один недостаток:во время установки я также устанавливаю пару служб Windows, которые при желании можно запустить сразу.Однако они потерпят неудачу, если DbUpdateManager еще не запущен.

Итак, чего я пытаюсь добиться, так это:

  1. Установите DbUpdateManager и мои службы из моего MSI.
  2. Запустите DbUpdateManager. ДО любая из служб запускается

Мой текущий источник WiX выглядит примерно так:

<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
  <!-- DbUpdateManager component with the necessary files -->
  <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
     <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe' 
           Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe'  KeyPath='no' />
  </Component>

  <!-- Component to install one of my Windows services -->
  <Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
     <File Id='InstallServiceFile' LongName='MyService.exe' 
           Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
     <ServiceInstall Id='InstallMyService' Name='MyService' 
                     Description='My Service' ErrorControl='normal' 
                     Start='auto' Type='ownProcess' Vital='yes' />
     <ServiceControl Id='UninstallMyService' Name='MyService' 
                     Remove='uninstall' Wait='yes' />
  </Component>

  <!-- Feature for the DbUpdateManager referencing the above component -->    
  <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR' 
           AllowAdvertise='no' Description='DbUpdateManager' Level='1' 
           Title='Database Update Manager'>
     <ComponentRef Id='DbUpdateManagerComponent'/>
  </Feature>

  <!-- Custom action for running DbUpdateManager -->    
  <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile' 
                ExeCommand='' Return='asyncWait' />

  <!-- Calling the custom action in the install sequence -->    
  <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' 
              After='InstallFinalize'>&amp;DbUpdateManager=3</Custom>

Я унаследовал этот WIX, и он работает, но, как я уже сказал, DbUpdateManager вызывается слишком поздно в процессе (только «After=InstallFinalize»), и поэтому службы не могут запуститься должным образом в первый раз (во второй раз все работает нормально). примерно, когда вы перезапускаете их вручную после запуска DbUpdateManager).

Я немного покопался в документации MSI и нашел хороший шаг под названием «StartServices», так что я подозревал, что просто изменю вызов специального действия на это:

   <InstallExecuteSequence>
          <Custom Action='RunDbUpdateManagerAction' 
                  Before='StartServices'>&amp;DbUpdateManager=3</Custom>

К сожалению, в этом случае вообще ничего не происходит - DbUpdateManager НИКОГДА не вызывается....

Есть идеи, почему?Отладка MSI/WiX действительно очень сложна, и я больше не вижу леса за деревьями....

Спасибо!Марк

РЕДАКТИРОВАТЬ:«RunDbUpdateManagerAction» помещается в правильное положение в таблице InstallExecuteSequence в моем MSI — сразу ПОСЛЕ InstallServices и сразу ПЕРЕД StartServices — и все же это не работает....DbUpdateManager (утилита Winforms) делает нет появляются во время установки :-(

РЕДАКТИРОВАТЬ 2:теперь мое действие кажется выполненным и в нужное время - к сожалению, я просто не вижу своего мастера :-( Я вижу код ошибки «возвращаемое значение 1631», что означает что-то вроде «Служба MSI не может быть началось" - какого черта???

MSI(s) (2C:D8) [20:53:36:383]:Выполняем действие:Rundbupdatemanageraction Action 20:53:36:RunDbUpdateManagerAction.Действие началось в 20:53:36:RunDbUpdateManagerAction.MSI(s) (2C:D8) [20:53:36:383]:Выполняем действие:Запускает действие 20:53:36:СтартСервисы.Службы начинаются действие, начатые в 20:53:36:СтартСервисы.Действие завершилось в 20:53:36:RunDbUpdateManagerAction.Возвращаемое значение 1631.

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

Решение

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

Используйте это в командной строке:msiexec /i [имя msi] /l*v [имя файла]

РЕДАКТИРОВАТЬ:Прочитав ваш комментарий, загляните на эту страницу. здесь вы можете попробовать добавить NOT INSTALLED в условие

РЕДАКТИРОВАТЬ2:я нашел это страница Найдите свою ошибку номер 1631.

Другие советы

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

По сути, я изменил выполнение своего специального действия на «отложенное» (как предложил Роб) и переместил точку в последовательности, где оно выполняется, на «After=InstallFiles».Я также изменил условие в теге <Custom> на «НЕ установлено», что, похоже, отлично работает в моем сценарии.

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

С нетерпением ждем полной окончательной версии WiX 3.0 (и ее будущего)!

Спасибо всем - к сожалению, я мог принять только один ответ - все бы его заслужили.

Марк

Похоже, что ваше CustomAction зависит от установленного DbUpdateManagerFile.Это означает, что ваше CustomAction необходимо запланировать. после InstallFiles выполнится.Помните, что InstallExecuteSequence состоит из двух проходов.Сначала выполняются «немедленные» (или «запланированные», или «генерация сценария») действия для построения журнала транзакций (также известного как:«установить скрипт»).Во-вторых, выполняются «отложенные» действия в журнале транзакций.

Прямо сейчас ваше CustomAction является «немедленным» (по умолчанию), поэтому оно пытается запустить до файлы фактически копируются на машину.Действие InstallFiles находится в сценарии перед вашим CustomAction, но оно еще не выполнено.

Итак, вам нужно пометить ваше CustomAction как «отложенное», чтобы оно запустилось. после ваши файлы установлены.

Примечание:вы, вероятно, не сможете отобразить пользовательский интерфейс из отложенного центра сертификации.Я не был уверен, что этот ваш инструмент должен отображать пользовательский интерфейс.

ПС:извини, если я не так хорошо объяснил, это был долгий день.

Вы можете открыть .msi в Орка и посмотрите таблицу InstallExecuteSequence, чтобы узнать, в каком порядке на самом деле происходят события.Это может дать вам хорошее представление о том, что на самом деле происходит и когда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top