Quelles sont les causes d'une mise à jour MSI ne pas mettre à jour un composant dans un programme d'installation?
(EDIT: cette Question a été modifiée.)
J'ai un produit avec un programme d'installation qui a été construit par InstallShield 2010, et semble, par tous les comptes de l'installation d'amende juste comme une "nouvelle" installation.
Périodiquement, je modifie le contenu de l'installation, comme je l'ai mise à jour de ce ou de ce composant avec des corrections de bugs et ainsi de suite. À ces moments-là, j'essaie de modifier les numéros de version dans les métadonnées des fichiers mis à jour, mais il y a des composants pour lesquels ce n'est pas possible. Bien sûr, ils finissent toujours avec les plus récentes modifier les dates. - Je changer le numéro de version du produit dans le fichier MSI de données. Cependant, je n'ai pas changé le Code du Package à chaque fois.
Lorsque certains utilisateurs d'exécuter le programme d'installation sur un système où mon produit est déjà présent, ils sont invités avec le mode de mise à jour de l'INTERFACE utilisateur ("voulez-vous mettre à jour?" etc.) et le programme d'installation s'affiche pour terminer. Cependant, les fichiers mis à jour ne sont pas toujours d'écraser les anciens fichiers jusqu'à une "réparation" de l'installation est exécuté par la suite, surtout si le numéro de version n'a pas changé, et il est désormais prouvé que le fait de signaler le contenu du composant avec une force de "remplacer" ne pas modifier ce comportement.
Ce qui se passe ici? Est il possible que je puisse obtenir un meilleur résultat? Le Code du Package besoin de changer à chaque fois que je rev du produit ou de la mise à jour d'un composant? (Edit: Le Code du Package est en train de changer à chaque fois que j'construire la libération, ce n'est donc pas la cause du problème.)
Edit: C'est une mise à jour de l'INTERFACE utilisateur, mais l'entretien après la mise à jour est ce qui s'est réellement terminée l'installation souhaité.
OriginalL'auteur Rob Perkins | 2011-01-14
Vous devez vous connecter pour publier un commentaire.
Vous devez certainement être en train de changer la PackageCode chaque build. En fait, par défaut, InstallShield a un paramètre de construction qui fait juste cela.
En fait, la rubrique d'aide MSDN Paquet De Codes dit:
Nonidentical .msi fichiers ne doivent pas avoir le même code de package. Il est important de changer le code du package car il s'agit de l'identifiant utilisé par l'installateur pour rechercher et valider le bon paquet pour une installation donnée. Si un paquet est modifié sans changer le code du package, le programme d'installation ne peut pas utiliser le nouveau package si les deux sont encore accessibles à l'installateur.
C'est pourquoi vous obtenez une Maintenance de l'INTERFACE utilisateur de l'expérience au lieu d'une expérience de Mise à niveau.
Maintenant, une fois que vous commencez à faire cela, vous allez avoir à côté envisager vous souhaitez vous appuyer sur les mises à jour Mineures, Majeures mises à jour ou Correctifs pour le service de votre application. Il est très important que vous compreniez ce et test de votre stratégie avant de mettre votre programme d'installation en production.
EDIT: j'ai trouvé la mise, et il est réglé sur "Oui" pour toutes mes sorties dans le projet. Donc, la cause de mon problème n'est pas immuable paquet de code, je suppose. Je vais poser la question comme une question dans son propre droit.
On dirait que vous êtes la mise à jour de la PackageCode et la génération d'un SEtup.exe et le résultat est une mise à niveau mineure. Vous devez suivre le composant règles à la lettre dans cette situation.
Sons sur la droite.
Lire msdn.microsoft.com/en-us/library/aa368599(v=vs. 85).aspx et msdn.microsoft.com/en-us/library/aa368267(v=vs. 85).aspx et à tous les liens de ces pages.
OriginalL'auteur Christopher Painter
Le programme d'installation est en train de faire ce qu'il est censé, basé sur le immuable informations de version de fichier.
Idéalement, vous mettez à jour la version du fichier chaque fois que vous modifiez un fichier (pour les fichiers qui contiennent des informations sur la version, mais si, pour quelque raison que ce soit, vous n'allez pas le faire, il y a toujours un couple de façons de les composantes de la force d'être mis à jour.
Le plus simple est de définir la propriété REINSTALLMODE. Vous pouvez l'installer à "amus", qui serait la cause de réinstallation de tous les fichiers. Voir MSDN - http://msdn.microsoft.com/en-us/library/aa371182%28v=vs.85%29.aspx
Qui fonctionne, mais peut présenter ses propres problèmes. Par exemple, si vous êtes y compris certains transmissibles dans votre colis, obligeant les composants redistribuables être réinstallé peut leur causer backleveled.
Un peu plus dur chemin, qui vous permet d'avoir le contrôle au niveau du composant individuel, est d'utiliser une action personnalisée. Appel MsiSetComponentState à définir explicitement chacun de vos composants à quelque état que vous voulez. http://msdn.microsoft.com/en-us/library/aa370383%28v=VS.85%29.aspx
Mon souvenir, c'est que votre action personnalisée doit venir après CostFinalize, de sorte que le programme d'installation de ne pas effacer vos mises à jour.
Cela permettra de justifier @Christophe du Peintre réponse: je suis maintenant au point où j'ai besoin de faire tourner le programme d'installation, et "AMUS" me donne de graves brûlures d'estomac. Maintenant, je dois aller à travers et correction de tous les composants. Je ne pense pas que Windows Installer et Installshield sont très convivial, même pour un programmeur expérimenté.
OriginalL'auteur Ed.
Dans @ChristopherPainter la réponse ci-dessus, j'ai aussi appris que InstallShield dispose d'un réglage permettant de générer automatiquement le code du package, mais il n'a pas dit où il était. Donc, pour quelqu'un d'autre à la recherche pour elle:
Ce paramètre se trouve sous Media /Releases /(nom de sortie), configuration de produit, onglet général.
Vous y trouverez des "Générer le Code du Package" et vous pouvez vérifier qu'il est défini à Oui.
OriginalL'auteur Jeff
Lorsque Windows Installer décide d'installer votre composant, il va d'abord regarder si le "chemin d'accès clé" ressource est déjà présent. Si elle l'est, aucune des ressources dans le composant sont installés. (Je suppose que l'Installshield met chaque fichier dans son propre composant, et le chemin d'accès clé est le fichier.)
Lorsque le chemin d'accès clé de ressource est de version de fichier, le programme d'installation de Windows va considérer qu'il existe seulement s'il trouve un fichier avec un égal ou supérieur. Donc, si un fichier avec le même numéro de version est déjà présente, il ne sera pas installé de nouveau. La modification d'un fichier sans modifier le numéro de version, par conséquent, causer des problèmes.
modifier: pourquoi une réparation résout le problème: je crois qu'il va réinstaller tous les composants de la mise en cache du fichier MSI dans
c:\windows\installer
indépendamment de la présence et de la version de la ressource chemin d'accès clé. Cela semble logique, car elle serait la seule façon de s'assurer que des fichiers corrompus sont restaurés. (Je ne peux pas trouver immédiatement un cadre de référence clair sur MSDN pour, désolée).TortoiseSVN développeur a blogué sur un problème similaire dans TortoiseSVN lors de la mise à niveau à partir d'une pré-1.6.10 version à plus tard. Dans son cas, le problème n'était pas la version du fichier, mais un changement dans le chemin d'accès clé de certains composants avec le même résultat. Une réparation aussi fixé l'application dans ce cas.
OriginalL'auteur Wim Coenen