Последовательность установки MSI - запускайте скрипты базы данных перед запуском служб
-
22-08-2019 - |
Вопрос
Люди,
мы столкнулись с некоторыми проблемами с последовательностью при нашей установке 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>