243 votes

Comment mettre en œuvre WiX programme d'installation de mise à niveau?

Au travail, nous utilisons WiX pour la construction de packages d'installation. 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 l'Internet à propos d'une mise à jour majeure, mais ne pouvait pas le faire fonctionner. Quelqu'un peut-veuillez préciser les étapes que je dois suivre pour ajouter désinstaller la précédente version de la fonctionnalité de WiX?

225voto

Dror Helper Points 15499

J'ai finalement trouvé une solution, je suis le poster ici pour d'autres personnes qui pourraient avoir le même problème (tous les 5 de vous):

  • Changer l'ID de produit à *
  • En vertu de produit ajoutez La ligne suivante:

    <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> 
    
  • En vertu de InstallExecuteSequence ajouter:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

À partir de maintenant chaque fois que j'ai installer le produit, il est retiré précédentes versions installées.

Remarque: remplacer la mise à niveau de l'Id avec votre propre GUID

211voto

Ant Points 2171

Dans les versions les plus récentes (à partir de la 3.5.1315.0 bêta), vous pouvez utiliser le MajorUpgrade élément au lieu d'utiliser votre propre.

Par exemple, nous avons utilisé ce code pour faire les mises à jour automatiques. Il empêche les mises à niveau, donnant un localisée message d'erreur, et empêche également la mise à niveau d'une version identique (c'est à dire uniquement les versions antérieures sont mis à jour):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

89voto

Rob Mensching Points 20732

Ce qui suit est le genre 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>

@Brian Gillespie a noté il y a d'autres endroits à l'annexe de l'RemoveExistingProducts en fonction désirée optimisations. Note de l'GUID-ICI doivent être identiques.

40voto

Brian Gillespie Points 1321

La Mise à niveau de l'élément à l'intérieur de l'élément Produit, combinée avec la bonne planification de l'action, sera d'effectuer la désinstallation que vous êtes après. Assurez-vous de la liste de la mise à jour des codes 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 constructions, vous pouvez empêcher les personnes accidentellement de l'installation d'une ancienne version de votre produit sur une version plus récente. C'est ce que le Maximum de terrain. Lorsque nous construisons des installateurs, nous avons mis en UpgradeVersion Maximum pour la version en cours de construction, mais IncludeMaximum="no" pour éviter ce scénario.

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

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

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

Un autre avantage est l'efficacité: si il y a des fichiers inchangés, le programme d'installation de Windows ne prend pas la peine de les copier à nouveau lorsque vous planifiez après InstallFinalize. Si vous planifiez après InstallInitialize, la version précédente est complètement retiré d'abord, et ensuite la nouvelle version est installée. Il en résulte inutile de suppression et de recopie de fichiers.

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

16voto

Mike Dimmick Points 6112

Vous pourriez être mieux de demander à ce sur le WiX-liste de diffusion des utilisateurs.

WiX est préférable de l'utiliser avec une solide compréhension de ce que Windows Installer est en train de faire. Vous pourriez envisager de faire "Le Guide Définitif de Windows Installer".

L'action qui supprime un produit existant est le RemoveExistingProducts action. Parce que les conséquences de ce qu'il fait dépend de l'endroit où il est prévu, à savoir si une défaillance entraîne l'ancien produit à être réinstallé, et si les fichiers non modifiés sont copiés encore une fois, vous devez le programmer vous-même.

RemoveExistingProducts processus <Upgrade> des éléments de l'installation en cours, correspondant à l' @Id d'attribut à l' UpgradeCode (spécifié dans l' <Product> ) de tous les produits installés sur le système. L' UpgradeCode définit une famille de produits connexes. Tous les produits qui ont ce UpgradeCode, dont les versions tomber dans la plage spécifiée, et où l' UpgradeVersion/@OnlyDetect attribut est - no (ou est omis), sera supprimé.

La documentation pour l' RemoveExistingProducts mentions réglage de l' UPGRADINGPRODUCTCODE de la propriété. Cela signifie que le processus de désinstallation pour le produit retiré reçoit que des biens, dont la valeur est l' Product/@Id pour le produit en cours d'installation.

Si votre installation d'origine ne comporte pas de UpgradeCode, vous ne serez pas en mesure d'utiliser cette fonctionnalité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X