2017-08-15 4 views
0

J'ai un MSI qui installe certains services. J'ai changé le nom pour l'un d'entre eux et mis à jour les références dans les fichiers Wix.Erreur lors de la mise à jour du nom du service dans MSI Installer et réinstallé/mis à niveau

Cela fonctionne très bien quand je l'installe simplement comme MSI frais. Cependant, quand il y a un scénario de mise à niveau (où MSI est installé avec l'ancien nom du service et je tente d'installer ce nouveau MSI qui a l'un des noms de service changé), je reçois l'erreur suivante:

ERROR

Des indices ici? Je suis juste en train de renommer les fichiers .wxs. Dois-je désinstaller l'ancien avec l'identifiant du composant existant et nommer le nouveau avec l'identifiant du nouveau composant?

Actuellement, en utilisant l'ancien ID de composant avec un nouveau nom.

QUELQUES PARTIE DU VIEUX CODE:

<Directory Id="dirxxx" Name="oldname"> 
       <!-- oldname service--> 
       <Component Id="cmpOldNameService" Guid="bbb" 
        SharedDllRefCount="no" KeyPath="no" NeverOverwrite="no" Permanent="no" Transitive="no" 
        Win64="no" Location="either"> 
       <RemoveFile Id="ccc" On="uninstall" Name="z.dll"/> 
       <File Id="ccc" KeyPath="no" Source="$(var.xSource)\OldNameService\a.dll"/> 
       <File Id="ddd" KeyPath="no" Source="$(var.xSource)\OldNameService\b.dll"/> 
       <File Id="eee" KeyPath="no" Source="$(var.xSource)\OldNameService\c.dll"/> 
       <File Id="fff" KeyPath="no" Source="$(var.xSource)\OldNameService\d.dll"/> 
       <File Id="ggg" KeyPath="no" Source="$(var.xSource)\OldNameService\e.dll"/> 
       <File Id="hhh" KeyPath="no" Source="$(var.xSource)\OldNameService\f.dll"/> 
       <File Id="iii" KeyPath="yes" Source="$(var.xSource)\OldNameService\g.exe"/> 
       <File Id="jjj" KeyPath="no" Source="$(var.xSource)\OldNameService\h.dll"/> 
       <File Id="kkk" KeyPath="no" Source="$(var.xSource)\OldNameService\i.dll"/> 
       <ServiceInstall Id="OldNameService" DisplayName="OldName Service" Name="NewName" 
       ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Description="OldName Service"> 
       <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnReinstall="yes"/> 
       </ServiceInstall> 

       <ServiceControl Id="OldNameServiceControl" Name="NewName" 
       Start="install" Stop="uninstall" Remove="uninstall" Wait="no"/> 

      </Component> 

       <Component Id="lll" Guid="mmm" NeverOverwrite="yes"> 
       <File Id="nnn" KeyPath="yes" Source="$(var.xSource)\OldNameService\OldName.exe.config"/> 
       <util:XmlFile Id="UpdateOldNamelogFileName" 
           File="[#nnn]" 
           Action="setValue" 
           ElementPath="/configuration/appSettings/add[\[]@key='logFile'[\]]/@value" 
           Value="[ooo]oldname_YYYYMM.log" /> 
       </Component> 

REMPLACE AVEC UN NOUVEAU CODE:

<Directory Id="dirxxx" Name="newname"> 
       <!-- newname service--> 
       <Component Id="cmpNewNameService" Guid="bbb" 
        SharedDllRefCount="no" KeyPath="no" NeverOverwrite="no" Permanent="no" Transitive="no" 
        Win64="no" Location="either"> 
       <RemoveFile Id="ccc" On="uninstall" Name="z.dll"/> 
       <File Id="ccc" KeyPath="no" Source="$(var.xSource)\NewNameService\a.dll"/> 
       <File Id="ddd" KeyPath="no" Source="$(var.xSource)\NewNameService\b.dll"/> 
       <File Id="eee" KeyPath="no" Source="$(var.xSource)\NewNameService\c.dll"/> 
       <File Id="fff" KeyPath="no" Source="$(var.xSource)\NewNameService\d.dll"/> 
       <File Id="ggg" KeyPath="no" Source="$(var.xSource)\NewNameService\e.dll"/> 
       <File Id="hhh" KeyPath="no" Source="$(var.xSource)\NewNameService\f.dll"/> 
       <File Id="iii" KeyPath="yes" Source="$(var.xSource)\NewNameService\g.exe"/> 
       <File Id="jjj" KeyPath="no" Source="$(var.xSource)\NewNameService\h.dll"/> 
       <File Id="kkk" KeyPath="no" Source="$(var.xSource)\NewNameService\i.dll"/> 
       <ServiceInstall Id="NewNameService" DisplayName="NewName Service" Name="NewName" 
       ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Description="New Name Service"> 
       <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnReinstall="yes"/> 
       </ServiceInstall> 

       <ServiceControl Id="NewNameServiceControl" Name="NewName" 
       Start="install" Stop="uninstall" Remove="uninstall" Wait="no"/> 

      </Component> 

       <Component Id="lll" Guid="mmm" NeverOverwrite="yes"> 
       <File Id="nnn" KeyPath="yes" Source="$(var.xSource)\NewNameService\NewName.exe.config"/> 
       <util:XmlFile Id="UpdateNewNamelogFileName" 
           File="[#nnn]" 
           Action="setValue" 
           ElementPath="/configuration/appSettings/add[\[]@key='logFile'[\]]/@value" 
           Value="[ooo]newservice_YYYYMM.log" /> 
       </Component> 
+0

Pouvez-vous renommer le fichier de service dans la configuration de mise à jour? Si vous le pouvez, essayez de renommer le fichier de service ET donnez-lui un nouveau GUID de composant. –

+0

Mise à niveau majeure ou mise à jour mineure? –

+0

@ SteinÅsmul a modifié mon message et ajouté du code. – Atihska

Répondre

0

J'ai donc été capable de résoudre mon problème ici. Je voulais faire une mise à niveau mineure et ajouté Account propriété dans ServiceInstall comme Network Service.

<ServiceInstall Id="Service1" DisplayName="My Service" Name="MyService" 
        ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Description="My Service" Account="NT Authority\NetworkService"> 
2

Cela est devenu trop longtemps pour ajouter un commentaire, j'ajoute cela comme une réponse si elle peut-être doesn Ne répondez pas à vos questions:

  • L'erreur la plus évidente ou au moins un problème non standard est que vous avez beaucoup de binaires en un seul composant. C'est pas la meilleure pratique (très mauvaise pratique en fait).
  • Avant de faire quoi que ce soit d'autre, veuillez diviser ce composant et créer un composant par fichier. J'utilise toujours un seul fichier par composant, même pour les non-binaires, mais les meilleures pratiques indiquent que vous devez toujours utiliser un composant séparé pour les binaires. En substance, c'est une exigence pour un bon déploiement.
  • Pour rester très court: si vous conservez plusieurs fichiers dans le même composant, un seul d'entre eux est un fichier clé. Si le numéro de version de ce fichier n'a pas été incrémenté (pour les fichiers binaires), tous les autres fichiers ne seront pas mis à jour, même si leurs versions sont incrémentées. Seul le fichier clé détermine si le composant est installé ou non. Et un composant n'est installé que dans son ensemble ou pas du tout. Les choses fonctionnent de manière similaire pour les fichiers non versionnés, mais ce n'est pas la version qui est vérifiée, mais si le fichier a été modifié ou non. Si le fichier sur le disque a été modifié, le composant est et non installé. Lire la suite dans l'article MSDN File Versioning Rules. Vous pouvez également vérifier this Symantec article sur le même problème. Et la réponse à cette question mérite une lecture (avec le commentaire de Chris Painter): File Versioning Rules When Neither Components Has a Key File
  • Si vous avez un « version live » de votre demande, je utiliser une mise à jour majeure avec RemoveExistingProducts prévue au début InstallExecuteSequence. En clair, cela signifie que vous allez désinstaller complètement la version précédente avant l'installation de la nouvelle version. Cela devrait éliminer toutes les erreurs consécutives à l'erreur de création de votre composant ou à toute autre erreur. Je ne l'ai pas lu complètement, mais cette réponse (la première) semble être une bonne explication de la façon de planifier votre mise à jour majeure: How to get WiX major upgrade working?.Ou aller directement pour la source et check the WiX 3 documentation for how to implement a major upgrade, et juste pour faire bonne mesure, j'inclut ce lien: How to implement WiX installer upgrade?
  • En plus de tout cela, je veux vous suggérer que vous "simplifier" votre WiX XML comme expliqué dans cette réponse: Syntax for guids in WIX?. Moins vous définissez d'attributs, plus il est facile de lire le contenu du fichier, et moins les erreurs peuvent se cacher (et les mises à niveau au format XML peuvent être plus faciles plus tard).
  • S'il vous plaît essayer ce "composant de réparation" et mise à niveau majeure d'abord pour voir si cela résout vos problèmes. Et essayez le source simplification aussi.
+0

J'ai pensé au problème mais n'ai pas trouvé la solution. Je dois donc désinstaller l'ancien service et tous ses composants, puis installer un nouveau service. – Atihska

+0

Quels devraient être mes éléments ServiceControl et ServiceInstall? Les deux sont-ils nécessaires pour les anciens services déjà installés? De plus, ai-je besoin d'ajouter RemoveFolder à chaque composant de ce répertoire? – Atihska

+0

Je voudrais planifier une mise à jour majeure où vous désinstallez l'ancienne version complètement avant d'installer la nouvelle version. Cela implique l'exécution de RemoveExistingProducts avant InstallInitialize dans InstallExecuteSequence. Je mettrais les éléments ServiceControl et ServiceInstall dans le composant qui contient votre exécutable de service principal. Je suppose que vous avez converti votre configuration pour utiliser un composant par fichier? –