web-dev-qa-db-fra.com

Comment implémenter la mise à jour du programme d'installation WiX?

Au travail, nous utilisons WiX pour construire des 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?

228
Dror Helper

Dans les versions les plus récentes (à partir de la version 3.5.1315.0 bêta), vous pouvez utiliser le élé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 rétrogradations, donne 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"
    />
180
Ant

Enfin, 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 du produit en *
  • Sous 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.

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

219
Dror Helper

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 planifier les RemoveExistingProducts en fonction des optimisations souhaitées. Notez que le PUT-GUID-HERE doit être identique.

88
Rob Mensching

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 souhaitée. 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 version plus récente. C'est ce que le champ Maximum est pour. Lorsque nous construisons des programmes d'installation, nous définissons UpgradeVersion Maximum sur la version en cours de construction, mais IncludeMaximum = "no" empêche ce scénario.

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

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

Cela laisse la version précédente du produit installée jusqu'à ce que les nouveaux fichiers et clés de registre soient copiés. 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.

L'efficacité est un autre avantage: 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

40
Brian Gillespie

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

WiX est mieux utilisé avec une solide compréhension de ce que fait Windows Installer. Vous pourriez envisager d’obtenir " Le guide définitif de Windows Installer ".

L'action qui supprime un produit existant est la action RemoveExistingProducts . Parce que les conséquences de ce qu'il fait dépendent de l'endroit 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> éléments de l’installation en cours, correspondant au @Id attribut au UpgradeCode (spécifié dans le <Product> élément) de tous les produits installés sur le système. Le UpgradeCode 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 le UpgradeVersion/@OnlyDetect attribut est no (ou est omis), sera supprimé.

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

Si votre installation d'origine n'incluait pas UpgradeCode, vous ne pourrez pas utiliser cette fonctionnalité.

15
Mike Dimmick

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

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

Ensuite, j'ai créé un exemple de programme d'installation (installé un fichier de test), puis 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 de Windows Installer", cela vous aidera à comprendre, mais ce n'est pas écrit avec WiX.

Un autre site qui a été très utile était celui-ci:

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

11
CheGueVerra

J'ai lu la documentation WiX , des exemples téléchargés, mais j'ai toujours eu beaucoup de problèmes avec les 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'usage:

<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 dit d’utiliser le " REINSTALL = ALL REINSTALLMODE = vomus "paramètres pour les mises à jour mineures et mineures, mais cela ne dit pas que ces paramètres sont INTERDITS pour les mises à niveau majeures - ils s’arrêtent simplement travail. Donc, vous ne devriez pas les utiliser avec des mises à jour majeures.

10
Sasha

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 .

7
Faraz

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

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

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 produit GUID mais, bien sûr, obtenez un nouveau GUID pour le package.

Les mises à niveau majeures désignent 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.

7
Daniel Morritt

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.

5
Merill Fernando

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.

2
NishantJ

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

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
1