séquence d'installation MSI - exécuter des scripts DB avant que les services commencent
-
22-08-2019 - |
Question
Folks,
nous courons dans certains problèmes de séquençage avec notre MSI installer. Dans le cadre de notre application, nous installons un tas de services et permettre à l'utilisateur de choisir si les commencer tout de suite ou plus tard.
Quand ils commencent tout de suite, ils semblent commencer trop tôt dans la séquence d'installation - avant notre gestionnaire de base de données a eu la chance de mettre à jour la base de données
.En ce moment, notre action personnalisée pour exécuter la base de données updater ressemble à ceci - il est exécuté après « InstallFinalize. » - très tard dans le processus
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallInitialize' />
<Custom Action='RunDbUpdateManagerAction' After='InstallFinalize'>
DbUpdateManager=3</Custom>
</InstallExecuteSequence>
Quelle serait l'étape plus appropriée à courir après ou avant, pour vous assurer que les scripts sont exécutés DB avant l'un des services installés démarrage en place? Y at-il une étape « BeforeServiceStart »?
EDIT:
Il suffit de définir l'attribut « Avant = 'StartServices de » sur l'étiquette n'a pas résolu mon problème.
Je suppose la question est la suivante: l'action personnalisée a un « texte intérieur », ce qui représente une condition, et cette condition est la suivante: « & DbUpdateManager = 3 ». D'après ce que je peux en déduire tâtonnement, cela signifie probablement « la fonction DbUpdateManager doit être publié ».
Maintenant, la difficulté est la suivante: « PublishFeature » vient ainsi à la fin de la séquence d'installation, juste avant « InstallFinalize », et certainement APRÈS InstallServices / StartServices. Alors, quand je le précise « Avant = StartServices » exigence, la condition « caractéristique DbUpdateManager doit être publié » est pas vrai encore, de sorte que le DbUpdateManager ne soit pas exécuté: - (
J'ai essayé de supprimer la condition - dans ce cas, mon DbUpdateManager n'exécute parfois pas du tout, parfois plus d'une fois - pas de réelle tendance claire quant à ce qui se passe quand .....
plus d'idées ?? Est-il possible que je puisse vérifier une condition « la fonction DbUpdateManager est installé » qui serait vrai après l'étape de « InstallFiles » ??
Marc
La solution
Il n'y a pas BeforeServiceStart
, mais vous pouvez essayer Before='StartServices'
.
Autres conseils
Eh bien, il semble que marc_s obtenu une réponse à une autre question . Cependant, étant donné que ma solution était légèrement différente et l'autre question nécessite un peu de reconstruction pour obtenir une solution, voici exactement ce qui a fonctionné pour moi:
...
<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>