Comment mettre à jour WiX installer?

au travail nous utilisons WiX pour les paquets d'installation de bâtiment. Nous voulons que l'installation du produit X entraînerait la désinstallation de la version précédente de ce produit sur la machine.

j'ai lu à plusieurs endroits sur Internet au sujet d'une mise à niveau majeure, mais je n'ai pas pu la faire fonctionner. Est-ce que quelqu'un peut s'il vous plaît spécifier les étapes exactes que je dois prendre pour ajouter désinstaller la fonctionnalité de version précédente à WiX?

219
demandé sur Peter Mortensen 2008-09-22 14:34:12

12 réponses

dans les versions les plus récentes (à partir du 3.5.1315.0 beta), vous pouvez utiliser L'élément MajorUpgrade au lieu d'utiliser le vôtre.

par exemple, nous utilisons ce code pour effectuer des mises à jour automatiques. Il empêche les déclassements, en donnant un message d'erreur localisé, et empêche également la mise à niveau d'une version identique déjà existante (c'est-à-dire que seules les versions inférieures sont mises à niveau):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />
165
répondu Ant 2017-12-14 09:58:20

finalement j'ai trouvé une solution - je la poste ici pour d'autres personnes qui pourraient avoir le même problème (vous 5):

  • Changer l'ID de produit à *
  • sous le produit ajouter le suivant:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • sous InstallExecuteSequence ajouter:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

désormais chaque fois que j'installe le produit, il a enlevé précédent les versions installées.

Note: remplacer l'identifiant de mise à niveau par votre propre identifiant

212
répondu Dror Helper 2011-03-31 11:35:20

voici le type de syntaxe que j'utilise pour les mises à niveau majeures:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

comme @Brian Gillespie a noté qu'il y a d'autres endroits pour programmer les produits de suppression existants en fonction des optimisations souhaitées. Notez que le PUT-GUID-HERE doit être identique.

87
répondu Rob Mensching 2009-04-07 04:05:23

l'élément de mise à niveau à l'intérieur de l'élément produit, combiné avec une planification appropriée de l'action effectuera la désinstallation vous êtes après. Assurez-vous d'énumérer les codes de mise à jour de tous les produits que vous voulez supprimer.

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

notez que, si vous êtes prudent avec vos constructions, vous pouvez empêcher les gens d'installer accidentellement une version plus ancienne de votre produit sur une plus récente. C'est à ça que sert le champ Maximum. Lorsque nous construisons des installateurs, nous définissons Upgredversion Maximum à la version en cours de construction, mais IncludeMaximum="no" pour empêcher ce scénario.

vous avez des choix en ce qui concerne l'ordonnancement des produits de déménagement existants. Je préfère le programmer après InstallFinalize (plutôt qu'après InstallInitialize comme d'autres l'ont recommandé):

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

il reste la version précédente du produit installé jusqu'à ce que les nouveaux fichiers et clés de Registre soient copiés. Cela me permet de migrer des données à partir de la ancienne version à la nouvelle (par exemple, vous avez changé le stockage des préférences de l'utilisateur du Registre à un fichier XML, mais vous voulez être poli et migrer leurs paramètres). Cette migration se fait dans une action personnalisée différée juste avant InstallFinalize.

un autre avantage est l'efficacité: s'il y a des fichiers inchangés, Windows Installer ne prend pas la peine de les copier à nouveau lorsque vous programmez après InstallFinalize. Si vous programmez après InstallInitialize, la version précédente est complètement supprimé d'abord, puis la nouvelle version est installée. Il en résulte une suppression et un recopiage inutiles des fichiers.

pour les autres options de planification, voir la rubrique D'aide supprimer les produits existants dans MSDN. Cette semaine, le lien est: http://msdn.microsoft.com/en-us/library/aa371197.aspx

40
répondu Brian Gillespie 2008-10-18 05:56:37

vous pourriez être mieux de demander cela sur la liste de diffusion WiX-users .

WiX est mieux utilisé avec une compréhension ferme de ce que Windows Installer fait. Vous pourriez envisager d'obtenir " " le guide définitif de L'installateur de Windows ".

L'action qui supprime un produit existant est la action de suppression des produits existants . Parce que les conséquences de ce qu'il fait dépend de l'endroit où il est prévu - à savoir, si un échec provoque l'ancien produit à être réinstallé, et si les fichiers inchangés sont copiés à nouveau - vous devez programmer vous-même.

RemoveExistingProducts traite <Upgrade> éléments dans l'installation actuelle, correspondant à l'attribut @Id à UpgradeCode (spécifié dans l'élément <Product> ) de tous les produits installés sur le système. Le UpgradeCode définit une famille de produits connexes. Tout les produits qui ont CE Code de mise à jour, dont les versions tombent dans la gamme spécifiée, et où l'attribut UpgradeVersion/@OnlyDetect est no (ou est omis), seront supprimés.

la documentation pour RemoveExistingProducts mentionne le réglage de la propriété UPGRADINGPRODUCTCODE . Cela signifie que le processus de désinstallation pour le produit retiré reçoit cette propriété, dont la valeur est Product/@Id pour le produit installé.

Si votre installation originale ne comporte pas de UpgradeCode , vous ne pourrez pas utiliser cette fonctionnalité.

15
répondu Mike Dimmick 2013-01-31 11:29:21

j'ai utilisé ce site pour m'aider à comprendre les bases de la mise à niveau de WiX:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

après j'ai créé un exemple D'installateur, (j'ai installé un fichier test), puis j'ai créé L'installateur de mise à niveau (j'ai installé 2 Exemples de fichiers test). Cela vous donnera une compréhension de base du fonctionnement du mécanisme.

et comme Mike a dit dans le livre de Apress, "The Definitive Guide to Windows Installer", il vous aidera à comprendre, mais il n'est pas écrit en utilisant WiX.

un autre site qui était assez utile était celui-ci:

http://www.wixwiki.com/index.php?title=Main_Page

11
répondu CheGueVerra 2013-01-31 11:24:25

j'ai lu la documentation WiX , j'ai téléchargé des exemples, mais j'avais encore beaucoup de problèmes avec les mises à jour. Les mises à niveau mineures n'exécutent pas la désinstallation des produits précédents malgré la possibilité de spécifier ceux désinstaller. J'ai passé plus d'une journée pour les enquêtes et j'ai découvert que WiX 3.5 a introduit une nouvelle étiquette pour les mises à niveau. Voici l'usage:

<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." AllowDowngrades="no" />

mais la principale raison des problèmes était que la documentation dit d'utiliser les" REINSTALL=ALL REINSTALLMODE=vomus " paramètres pour les mises à niveau mineures et petites, mais il ne dit pas que ces paramètres sont interdit pour les mises à niveau majeures - ils arrêtent tout simplement de fonctionner. Donc vous ne devriez pas les utiliser avec des améliorations majeures.

10
répondu Oleksandr Pshenychnyy 2013-05-08 18:04:21

je suggère de jeter un oeil au tutoriel D'Alex Shevchuk. Il explique "major upgrade "via WiX avec un bon exemple pratique à de MSI à WiX, Partie 8-Major Upgrade .

7
répondu Faraz 2010-01-31 01:39:47

une chose importante que j'ai manquée dans les tutoriels pendant un certain temps (volé dans http://www.tramontana.co.hu/wix/lesson4.php ) qui a abouti à la" Une autre version de ce produit est déjà installé "erreurs:

* Petites mises à jour signifie les petites modifications apportées à un ou quelques fichiers où le changement n'est pas la peine de changer la version du produit (majeur.mineur.construire.) Vous n'avez pas à changer le produit guided, non plus. Notez que vous devez toujours modifier la directive Package GUID lorsque vous créez un nouveau paquet .fichier msi qui est différent des précédents. L'installateur garde trace de vos programmes installés et les trouve quand l'utilisateur veut changer ou enlever l'installation en utilisant ces GUIDs. Utiliser la même directive pour des paquets différents est une source de confusion pour L'installateur.

mises à niveau mineures dénote des changements où la version du produit sera déjà le changement. Modifier l'attribut Version de la balise produit. Le produit restera le même, de sorte que vous n'avez pas besoin de changer le produit guide, mais, bien sûr, obtenir un nouveau paquet guide.

Major upgrades dénote des changements significatifs comme passer d'une version complète à une autre. Tout changer: attribut de Version, GUID produit et Package.

7
répondu Daniel Morritt 2010-12-24 10:52:46

j'utilise la dernière version de WiX (3.0) et je n'ai pas pu faire fonctionner ce qui précède. Mais cela a fonctionné:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

notez que PUT-GUID-HERE doit être la même que la GUID que vous avez définie dans la propriété Upgredecode du produit.

5
répondu Merill Fernando 2010-03-09 07:57:55

ci-dessous travaillait pour moi.

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

S'il vous plaît assurez-vous que le code de mise à niveau dans le produit correspond à L'Id dans la mise à niveau.

2
répondu NishantJ 2017-01-27 19:03:39

C'est ce qui a fonctionné pour moi, même avec le major DOWN grade:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
1
répondu Gian Marco Gherardi 2014-03-24 19:40:40