Question

Au travail, nous utilisons WiX pour la création de packages d'installation. Nous voulons que l’installation du produit X entraîne la désinstallation de la version précédente de ce produit sur cette machine.

J'ai lu à plusieurs endroits sur Internet une mise à jour majeure, mais je n'ai pas réussi à la faire fonctionner. Quelqu'un peut-il spécifier les étapes exactes à suivre pour ajouter la fonctionnalité de désinstallation de la version précédente à WiX?

Était-ce utile?

La solution

Dans les dernières versions (à partir de la version 3.5.1315.0 bêta), vous pouvez utiliser le Elément MajorUpgrade au lieu d'utiliser le vôtre.

Par exemple, nous utilisons ce code pour effectuer des mises à niveau automatiques. Il empêche les dégradations, génère 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"
    />

Autres conseils

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

  • Modifiez l'ID de produit en *
  • Sous le produit, ajoutez ce qui suit:

    <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, ajoutez:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

À partir de maintenant, chaque fois que j'installe le produit, les versions précédemment installées sont supprimées.

Remarque: remplacez l'identifiant de mise à niveau par votre propre GUID

.

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 l’a noté, il existe d’autres emplacements pour programmer les RemoveExistingProducts en fonction des optimisations souhaitées. Notez que le PUT-GUID-HERE doit être identique.

L'élément de mise à niveau à l'intérieur de l'élément produit, associé à une planification appropriée de l'action, effectuera la désinstallation que vous recherchez. Veillez à répertorier les codes de mise à niveau de tous les produits que vous souhaitez 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 versions, vous pouvez empêcher les personnes d'installer accidentellement une version plus ancienne de votre produit sur une nouvelle. C'est ce que le champ Maximum est pour. Lorsque nous construisons des installateurs, nous définissons UpgradeVersion Maximum à la version en cours de construction, mais IncludeMaximum = & "No &"; pour éviter ce scénario.

Vous avez le choix entre la planification de RemoveExistingProducts. Je préfère le planifier après InstallFinalize (plutôt qu'après InstallInitialize comme l'ont recommandé d'autres):

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

La version précédente du produit reste donc installée après la copie des nouveaux fichiers et des nouvelles clés de registre. Cela me permet de migrer les données de l'ancienne version vers la nouvelle (par exemple, vous avez basculé le stockage des préférences utilisateur du registre vers un fichier XML, mais vous voulez être poli et migrer leurs paramètres). Cette migration est effectuée dans une action personnalisée différée juste avant InstallFinalize.

Un autre avantage est l’efficacité: s'il y a des fichiers non modifiés, Windows Installer ne se soucie plus de les copier à nouveau lorsque vous planifiez après InstallFinalize. Si vous planifiez après InstallInitialize, la version précédente est d'abord complètement supprimée, puis la nouvelle version est installée. Cela entraîne la suppression et la recopie inutiles de fichiers.

Pour d'autres options de planification, voir la rubrique d'aide RemoveExistingProducts dans MSDN. Cette semaine, le lien est le suivant: http://msdn.microsoft.com/en- us / library / aa371197.aspx

Vous feriez mieux de poser cette question sur la liste de diffusion des utilisateurs de WiX .

Il est préférable d’utiliser WiX avec une solide compréhension de ce que fait Windows Installer. Vous pourriez envisager d’obtenir & Quot guide complet de Windows Installer ".

L'action qui supprime un produit existant est la l'action RemoveExistingProductsProducts. . Parce que les conséquences de ce qu’il fait dépendent du lieu où il est planifié, à savoir si une défaillance provoque la réinstallation de l’ancien produit et si les fichiers non modifiés sont à nouveau copiés, vous devez le planifier vous-même.

RemoveExistingProducts traite <Upgrade> les éléments de l'installation actuelle, en faisant correspondre l'attribut @Id à l'élément UpgradeCode (spécifié dans l'élément <Product>) de tous les produits installés sur le système. Le UpgradeVersion/@OnlyDetect définit une famille de produits connexes. Tous les produits dotés de ce code de mise à niveau, dont les versions se situent dans la plage spécifiée et pour lesquels l'attribut no est UPGRADINGPRODUCTCODE (ou omis), seront supprimés.

La documentation de Product/@Id mentionne la définition de la propriété <=>. Cela signifie que le processus de désinstallation du produit en cours de suppression reçoit cette propriété, dont la valeur est le <=> du produit en cours d'installation.

Si votre installation d'origine n'incluait pas de <=>, vous ne pourrez pas utiliser cette fonctionnalité.

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

http://wix.tramontana.co.hu/tutorial/upgrades -et-modularisation

Ensuite, j'ai créé un exemple d'installation (installé un fichier de test), puis créé le programme d'installation de mise à niveau (installé 2 exemples de fichiers de test). Cela vous donnera une compréhension de base du fonctionnement du mécanisme.

Et comme l'a dit Mike dans le livre d'Apress, & "Le guide définitif pour Windows Installer &", cela vous aidera à comprendre, mais ce n'est pas écrit avec WiX.

Un autre site plutôt utile était celui-ci:

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

J'ai lu la documentation de WiX , des exemples téléchargés, mais j'ai toujours eu beaucoup de problèmes avec mises à niveau. Les mises à niveau mineures n'exécutent pas la désinstallation des produits précédents malgré la possibilité de spécifier ceux-ci. J'ai passé plus d'une journée d'enquête et j'ai constaté que WiX 3.5 introduisait une nouvelle étiquette pour les mises à niveau. Voici l'utilisation:

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

Mais la raison principale des problèmes est que la documentation indique d’utiliser le " REINSTALL = ALL REINSTALLMODE = vomus " paramètres pour les mises à niveau mineures et mineures, mais cela ne signifie pas que ces paramètres sont INTERDITS pour les mises à niveau majeures - ils cessent tout simplement de fonctionner. Donc, vous ne devriez pas les utiliser avec des mises à jour majeures.

Je suggérerais de jeter un coup d'œil au tutoriel d'Alex Shevchuk. Il explique & "Mise à niveau majeure &"; via WiX avec un bon exemple pratique à De MSI à WiX, Partie 8 - Mise à niveau majeure .

Une chose importante que j'ai manquée dans les tutoriels pendant un moment (volé à http://www.tramontana.co .hu / wix / lesson4.php ), ce qui a entraîné le " Une autre version de ce produit est déjà installée " erreurs:

* Les petites mises à jour signifient de petites modifications apportées à un ou plusieurs fichiers dont les modifications ne justifient pas la modification de la version du produit (major.minor.build). Vous n'avez pas non plus besoin de changer le GUID du produit. Notez que vous devez toujours modifier le GUID du package lorsque vous créez un nouveau fichier .msi différent des précédents, à tous égards. Le programme d’installation assure le suivi de vos programmes installés et les recherche lorsque l’utilisateur souhaite modifier ou supprimer l’installation à l’aide de ces GUID. L'utilisation du même GUID pour différents packages entraînera la confusion du programme d'installation.

Les mises à niveau mineures indiquent les modifications pour lesquelles la version du produit sera déjà modifiée. Modifiez l'attribut Version de la balise Product. Le produit restera le même, vous n’avez donc pas besoin de changer le GUID du produit mais bien sûr d’obtenir un nouveau GUID pour le package.

Les mises à niveau majeures indiquent des modifications importantes, telles que le passage d'une version complète à une autre. Tout changer: attribut de version, GUID du produit et du package.

J'utilise la dernière version de WiX (3.0) et je ne parviens pas à 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 identique au GUID que vous avez défini dans la propriété UpgradeCode du Produit.

Ci-dessous a fonctionné 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>

Assurez-vous que le code de mise à niveau du produit correspond à l'identifiant de la mise à niveau.

C’est ce qui a fonctionné pour moi, même avec la note DOWN majeure:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top