WiX - essaient d'installer des séquences
Je suis installé à une grande application, et c'est une coutume écrite outil appelé "DbUpdateManager" à la messe exécuter des scripts SQL à l'encontre de notre base de données cible.
Droit maintenant, le WiX 2.x installer fonctionne - mais il a un défaut: lors de l'installation, j'ai aussi installer un couple de services de Windows, qui peut éventuellement être commencé tout de suite. Ceux cependant échoue, si le DbUpdateManager n'a pas été lancé.
Donc ce que je suis en train de l'accomplir, c'est ceci:
- Installer DbUpdateManager et mes services à partir de mon MSI
- Exécuter DbUpdateManager AVANT les services de démarrage
Mon WiX source ressemble à quelque chose comme ceci:
<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'>&DbUpdateManager=3</Custom>
J'ai hérité de cette WIX, et ça fonctionne, mais comme je l'ai dit - la DbUpdateManager est appelé trop tard dans le processus (seulement "Après=InstallFinalize") et donc le service ne démarre pas correctement à la première (l'exécuter correctement la deuxième fois, lorsque vous redémarrez manuellement après DbUpdateManager a exécuter).
J'ai tourné autour de la MSI documentation un peu et trouve une belle étape appelée "StartServices", de sorte que mon intuition était juste changer mon appel à l'action personnalisée pour cela:
<InstallExecuteSequence>
<Custom Action='RunDbUpdateManagerAction'
Before='StartServices'>&DbUpdateManager=3</Custom>
Malheureusement, dans ce cas, rien ne se passe - DbUpdateManager n'est JAMAIS appelé....
Des idées pourquoi? Débogage de la MSI/WiX truc est vraiment vraiment difficile, et je n'arrive pas à voir la forêt pour les arbres de plus....
Merci!
Marc
EDIT: Le "RunDbUpdateManagerAction" est placé dans la bonne position dans la table InstallExecuteSequence dans mon MSI - droit APRÈS InstallServices et juste AVANT StartServices - et pourtant, il ne fonctionne pas.... DbUpdateManager (un Winforms utilitaire) ne pas afficher lors de l'installation 🙁
EDIT 2: maintenant, mon action semble être exécutées et au bon moment - malheureusement, je suis juste de ne pas voir mon assistant 🙁 j'ai vu un code d'erreur "valeur de retour 1631", ce qui signifie quelque chose comme "Service MSI n'a pas pu démarrer" - wtf ???
MSI (s) (2C:D8) [20:53:36:383]: Faire de l'action: RunDbUpdateManagerAction
Action 20:53:36: RunDbUpdateManagerAction.
L'Action a débuté à 20:53:36: RunDbUpdateManagerAction.
MSI (s) (2C:D8) [20:53:36:383]: Faire de l'action: StartServices
Action 20:53:36: StartServices. Les Services sont en cours de démarrage
L'Action a débuté à 20:53:36: StartServices.
L'Action a terminé à 20:53:36: RunDbUpdateManagerAction. Valeur de retour 1631.
- Comme référence, l'suggéré InstallExecute séquence: msdn.microsoft.com/en-us/library/aa372038(v=vs. 85).aspx
Vous devez vous connecter pour publier un commentaire.
Essayer d'obtenir un fichier journal de l'Installation, et de regarder pour la séquence de l'ordre dans il y et la valeur de l'état d'exercer l'Action Personnalisée
L'utiliser dans la ligne de commande:
msiexec /i [msiname] /l*v [nom de fichier]
EDIT: Après lecture de votre commentaire jetez un oeil à cette page ici vous pourriez essayer d'ajouter n'est PAS INSTALLÉ dans la condition
EDIT2: j'ai trouvé ce page la Recherche de votre Numéro d'erreur 1631
Bien, j'ai finalement obtenu de travailler avec un peu d'aide de tous ceux qui ont répondu, et par la consultation de certains de la WiX des tutoriels et des pages d'aide sur le web. Programme d'installation MSI choses n'est pas facile de comprendre et d'apprendre......
En gros, j'ai changé l'exécution de mon action personnalisée "différé" (comme suggéré par Rob) et j'ai déplacé le point dans la séquence où il est exécuté à "Après l'=InstallFiles". J'ai aussi changé la condition dans le <Custom> tag "NON Installé", qui semble très bien fonctionner dans mon scénario.
Contrairement à Rob, la peur, la Db Gestionnaire de mise à Jour et son INTERFACE utilisateur arriver assez bien de cette façon, et le processus de mise à jour de notre base de données est maintenant terminé avant que l'un de nos services (qui dépendent de la base de données) commencer.
Hâte à une version RTM de WiX 3.0 (et son avenir) !
Merci à tout le monde, malheureusement, je ne pouvais qu'accepter une réponse - tout aurait mérité.
Marc
Il semble que votre CustomAction dépend de la "DbUpdateManagerFile' être installé. Cela signifie que votre CustomAction doit être prévue après InstallFiles exécute. Souvenez vous il y a deux laissez-passer pour le InstallExecuteSequence. Tout d'abord, le "immédiate" (ou "prévu" ou "génération du script"), les actions sont exécutées de manière à construire le journal des transactions (aka: "script d'installation"). Deuxièmement, le "différé" les actions dans le journal des transactions sont exécutées.
Dès maintenant votre CustomAction est "immédiate" (par défaut), il est donc d'essayer d'exécuter avant les fichiers sont copiés à la machine. Le InstallFiles action est dans le script avant de votre CustomAction mais il n'a pas encore été exécutés.
Donc, vous avez besoin de marquer votre CustomAction "différé" pour le faire fonctionner, après vos fichiers sont installés.
Remarque: vous n'êtes pas probablement pas en mesure de montrer de l'INTERFACE utilisateur à partir d'un différé de CA. Je n'étais pas sûr si cet outil de la vôtre a été prévu pour afficher l'INTERFACE utilisateur.
PS: désolé si je n'ai pas expliqué que bien, il a été une longue journée.
Vous pouvez ouvrir le .msi dans Orca et de regarder la table InstallExecuteSequence pour voir dans quel ordre les choses se passe dans. Cela peut vous donner une bonne idée de ce qui se passe vraiment quand.