Последовательность установки MSI - запускайте скрипты базы данных перед запуском служб

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

Вопрос

Люди,

мы столкнулись с некоторыми проблемами с последовательностью при нашей установке MSI.Как часть нашего приложения, мы устанавливаем множество сервисов и позволяем пользователю выбирать, запускать их сразу или позже.

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

Прямо сейчас наше пользовательское действие по запуску программы обновления базы данных выглядит следующим образом - оно выполняется после "InstallFinalize" - на самом позднем этапе процесса.

   <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' After='InstallFinalize'>
           DbUpdateManager=3</Custom>
   </InstallExecuteSequence>

Какой шаг был бы более подходящим для выполнения после или до, чтобы убедиться, что скрипты БД выполнены до того , как запускается какая-либо из установленных служб?Есть ли шаг "BeforeServiceStart"?

Редактировать:

Простое определение атрибута "Before='StartServices'" в теге не решило мою проблему.

Я предполагаю, что проблема заключается в следующем:пользовательское действие имеет "внутренний текст", который представляет условие, и это условие:"&DbUpdateManager=3".Из того, что я могу вывести методом проб и ошибок, это, вероятно, означает "функция DbUpdateManager должна быть опубликована".

Теперь проблема в том, что:"PublishFeature" появляется в конце последовательности установки, непосредственно перед "InstallFinalize" и определенно ПОСЛЕ InstallServices / StartServices.Поэтому, когда я указываю требование "Before=StartServices", условие "Функция DbUpdateManager должна быть опубликована" еще не выполнено, поэтому DbUpdateManager не выполняется :-(

Я попытался удалить условие - в этом случае мой DbUpdateManager иногда вообще не выполняется, иногда более одного раза - нет реальной четкой схемы относительно того, что происходит, когда.....

Есть еще какие-нибудь идеи??Есть ли способ, которым я мог бы проверить наличие условия "установлена функция DbUpdateManager", которое было бы истинным после шага "InstallFiles"??

Марк

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

Решение

Там нет никакого BeforeServiceStart, но вы могли бы попробовать Before='StartServices'.

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

Что ж, похоже, что marc_s получил ответ на этот вопрос в другом вопрос.Однако, поскольку мое решение было немного другим, а другой вопрос требует небольшой реконструкции, чтобы получить решение, вот именно то, что сработало для меня:

...
<InstallExecuteSequence>
  <Custom Action="CopyConfigs" 
          After="InstallFiles"><![CDATA[&ProductFeature = 3]]></Custom>
</InstallExecuteSequence>
<CustomAction Id="CopyConfigs"
              FileKey="copySamples"
              ExeCommand=""
              Execute="deferred"
              Impersonate="no"/>

<Directory Id="TARGETDIR" Name="SourceDir">
...
  <Directory Id="Config" Name="Config">
    <Component Id="ShippedConfigs" Guid="{8E6344C8-2B3F-4654-8B42-C09E76200052}">
      <File Id="copySamples"
            Source="$(var.ProjectDir)config\Copy.Configs.Sample.cmd"
            KeyPath="no"
            DiskId="1" />
    </Component>
  </Directory>
</Directory>

<Feature Id="ProductFeature" Title="MyService" Level="1">
  <ComponentRef Id="ShippedConfigs" />
  ...
</Feature>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top