WiX - пытаясь выяснить последовательность установки - PullRequest
5 голосов
/ 22 апреля 2009

Я устанавливаю большое приложение, и часть его представляет собой пользовательский инструмент под названием «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 и просто BEFORE 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 ]

10 голосов
/ 23 апреля 2009

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

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

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

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

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

Марк

6 голосов
/ 23 апреля 2009

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

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

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

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

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

5 голосов
/ 22 апреля 2009

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

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

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

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

4 голосов
/ 22 апреля 2009

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

...