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

Я устанавливаю большое приложение, и частично оно представляет собой пользовательский инструмент под названием "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 - справа после установки служб и только до StartServices - и все же это не работает.... DbUpdateManager (утилита Winforms) не отображается во время монтаж:-(

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

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

4 ответа

Решение

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

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

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

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

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

По сути, я изменил выполнение своего пользовательского действия на "отложенное" (как предложено Робом) и переместил точку в последовательности, в которой оно выполняется, на "After=InstallFiles". Я также изменил условие в теге на "NOT Installed", что в моем сценарии работает нормально.

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

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

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

Марк

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

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

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

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

PS: извините, если я не объяснил это хорошо, это был длинный день.

Вы можете открыть MSI-файл в Orca и просмотреть таблицу InstallExecuteSequence, чтобы увидеть, в каком порядке на самом деле происходят события. Это может дать вам хорошее представление о том, что на самом деле происходит, когда.

Другие вопросы по тегам