2014-05-09 4 views
1

Je suis en train de faire l'installation de WIX MSI slient, et il ya aussi quelques actions personnalisées entre si la customaction échoue comment faire reculer ou terminer le processus d'installation lent du msi? ? Je copie des fichiers et démarre également le service Windows en utilisant l'installation de Wix. Quand la customaction échoue, comment puis-je arrêter la création du répertoire et le démarrage du service Windows ??Wix installation silencieuse de MSI pouvons-nous arrêter la création de répertoire

[CustomAction] 
    public static ActionResult PrerequisiteCheck(Session session) 
    { 

       if (Status.IsServiceAvailable && Status.IsPrinter) 
       { 
        return ActionResult.Success; 
       } 
       else 
       { 
         //Stop Installer 
        return ActionResult.Failure; 
       } 
    } 

<CustomAction Id="CheckPrerequiste" BinaryKey="BIN_CustomAction" DllEntry="CheckPrerequiste" Return="ignore" Execute="immediate" /> 

<InstallExecuteSequence> <Custom Action="CA_PrerequisiteCheck" After="InstallExecute" > </Custom> 
</InstallExecuteSequence> 

<Directory Id="TARGETDIR" Name="SourceDir"> 
<Directory Id="ProgramFilesFolder"> 
<Directory Id="INSTALLLOCATION" Name="Service"> 
<Component Id="WindowsService" Guid="AA34D3C1-26F1-4A7E-A226-1AB01501C67C"> 
<File Id="00690A65EA1A3EFEB7607285DBA0C8C5" KeyPath="yes" Source="WindowsService.Svc.exe" /> 
<ServiceInstall Id="Service" Name="Service" DisplayName="Windows Service" Description="Windows Service" Start="auto" ErrorControl="normal" Type="ownProcess" /> 
<ServiceControl Id="sc_Service" Name="Service" Stop="both" Remove="uninstall" Wait="yes" /> 
<Component Id="WindowsSvcexe" Guid="06ABF18B-DEDE-4D98-AF9F-8384539A6BC3"> <File Id="49215CE1A25380930C771772AD14519B" KeyPath="yes" Source="WindowsService.Svc.exe.config" /> </Component> </Component> 
</Directory> 
</Directory> 
</Directory> 
+0

Personnellement, je trouve qu'il est plus facile de laisser l'installation entière échouer et revenir en arrière, puis essayer de résoudre les problèmes et de corriger l'erreur provoquée par l'action personnalisée. Maintenant, si vous vérifiez les conditions préalables, vous pouvez peut-être créer une fonctionnalité pour les composants qui requièrent la condition préalable et la désactiver si elles ne remplissent pas les conditions préalables. – jcmcbeth

Répondre

3

La séquence d'installation est divisée en deux étapes principales; immédiat et différé. La raison principale de la division d'une installation en deux phases (UI et exécution) est de fournir un retour en arrière en cas d'erreur. Toutes les actions dans la phase d'exécution, entre InstallInitialize et InstallFinalize sont incluses dans l'annulation, qui est appelée l'étape différée. La phase initiale, où le script de restauration est en cours de préparation mais la protection de restauration n'a pas encore démarré, est appelée phase immédiate. La séquence de l'interface utilisateur ne dispose d'aucune fonction de restauration. Par conséquent, les actions qui modifient le système ne doivent jamais y avoir lieu. Les actions personnalisées qui modifient le système doivent être marquées deferred et doivent être planifiées pour s'exécuter entre InstallInitialize et InstallFinalize dans la phase d'exécution. devraient être fournis par le promoteur pour des actions personnalisées actions déploiement dos:

… 
<CustomAction Id=”myaction” Execute=”deferred” Return=”check” /> 
… 
<InstallUISequence> 
    <Custom Action=”myaction” After=”CostFinalize” /> 
    <Custom Action=”myaction2” After=”myaction” /> 
</InstallUISequence> 
<InstallExecuteSequence> 
    <Custom Action=”myaction3” After=”InstallInitialize” /> 
    <Custom Action=”myaction4” After=”myaction3” /> 
</InstallExecuteSequence> 

actions personnalisées qui sont reportés exécuter au cours de la phase de la protégée de rollback de séquence Exécuter. Pour donner à ces actions des fonctionnalités de restauration, des actions personnalisées séparées qui annulent le travail doivent être créées. actions Rollback sont prévues avant que l'action qu'ils sont censés revenir en cas d'erreur:

<CustomAction Id="systemChangingCA" Execute="deferred" Script="vbscript"> 
    msgbox "Your system has been changed" 
</CustomAction> 

<CustomAction Id="rollbackSystemChangingCA" Execute="rollback" Script="vbscript"> 
    msgbox "System changes are undone" 
</CustomAction> 

<CustomAction Id="causeError" Execute="deferred" Script="vbscript"> 
    Err.Raise 507 
</CustomAction> 

Ceux-ci sont prévues comme:

<InstallExecuteSequence> 
    <Custom Action="rollbackSystemChangingCA" Before="systemChangingCA" /> 
    <Custom Action="systemChangingCA" After="InstallInitialize" /> 
    <Custom Action="causeError" After="systemChangingCA" /> 
</InstallExecuteSequence> 

Dans cet exemple, systemChangingCA se déroulera durant la phase différée de InstallExecuteSequence . Lorsque causeError s'exécute ensuite, une exception est déclenchée, ce qui déclenche une annulation. Puis rollbackSystemChangingCA s'exécute.

Le jeu d'outils Wix fournit également sa propre action personnalisée pour la stimulation d'une restauration appelée WixFailWhenDeferred. C'est une partie de WixUtilExtension et vous pouvez l'utiliser pour tester vos méthodes de restauration.

Les dossiers créés par WiX lui-même doivent être supprimés automatiquement lors d'une restauration.

Vous pouvez en apprendre plus sur le concept global de Microsoft Installer et WiX à partir du livre de Nick Ramirez: "Guide du développeur de Windows Installer XML". Il a de nombreux exemples et cas, y compris ceux ci-dessus.

+3

Cela semble être principalement "emprunté" au texte du livre de Nick Ramirez - il aurait été agréable de lui donner du crédit ou de recommander le livre "Guide du développeur de Windows Installer Xml". – PhilDW

+0

vrai, j'avais cela en tête mais j'ai oublié de l'ajouter; Merci pour le rappel! – mcy

Questions connexes