2009-03-25 9 views
3

Folks,Séquence d'installation MSI - exécuter des scripts DB avant le démarrage des services

Nous rencontrons des problèmes de séquencement avec notre installation MSI. Dans le cadre de notre application, nous installons un ensemble de services et permet à l'utilisateur de choisir de les démarrer immédiatement ou plus tard. Quand ils commencent tout de suite, ils semblent commencer trop tôt dans la séquence d'installation - avant que notre gestionnaire de base de données ait eu la chance de mettre à jour la base de données. À l'heure actuelle, notre action personnalisée pour exécuter le programme de mise à jour de la base de données ressemble à ceci: elle est lancée 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 à courir plus approprié avant ou après, pour vous assurer que les scripts sont exécutés DB avant l'un des services installés démarrage en place? Y a-t-il une étape "BeforeServiceStart"?

EDIT:

simple définition de l'attribut "Avant = 'StartServices de" sur l'étiquette n'a pas résolu mon problème.

Je suppose que le problème est le suivant: l'action personnalisée a un "texte interne", qui représente une condition, et cette condition est: "& DbUpdateManager = 3". De ce que je peux déduire de l'erreur d'essai &, cela signifie probablement que "la fonctionnalité DbUpdateManager doit être publiée".

Maintenant, le problème est: "PublishFeature" vient à la fin de la séquence d'installation, juste avant "InstallFinalize", et définitivement après InstallServices/StartServices. Donc, lorsque je spécifie l'exigence "Before = StartServices", la condition "DbUpdateManager doit être publiée" n'est pas encore vraie, donc le DbUpdateManager n'est pas exécuté :-(

J'ai essayé d'enlever la condition - en ce que cas, mon DbUpdateManager parfois ne s'exécute pas du tout, parfois plus d'une fois - pas vraiment de modèle clair quant à ce qui se passe quand .....

D'autres idées? Y at-il un moyen de vérifier une condition? "la fonction DbUpdateManager est installé" qui serait vrai après l'étape de "InstallFiles" ??

Marc

+0

+1 Je sais que cette question est vieux, mais j'ai le même problème (mise à jour d'un fichier de configuration utilisé par le service). Marc, puisque la suggestion d'Anton Tykhyy n'a pas résolu ceci, vous pourriez envisager de supprimer le drapeau de réponse. La question recevra plus d'attention et je n'aurai pas à le redemander. Juste une pensée. –

Répondre

1

Il n'y a pas BeforeServiceStart, mais vous pouvez essayer Before='StartServices'.

+0

Ça promet - Je vais essayer demain au bureau et revenir vers vous - merci! –

+2

Référence complète des actions standard: http://msdn.microsoft.com/fr-fr/library/aa372023(VS.85).aspx –

1

Eh bien, il semble que marc_s a obtenu cette réponse dans un 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> 
Questions connexes