J'ai écrit un programme d'installation avec Wix et cela a bien fonctionné pour installer mon programme. Maintenant, je dois le mettre à jour, j'ai donc augmenté le numéro de version, mais quand je vais installer le nouveau programme sur l'ancien, il se plaint qu'une ancienne version est déjà installée et me dit de la désinstaller en premier.
Comment puis-je le mettre à jour ou le désinstaller automatiquement avant de le réinstaller?
Je pense qu'aucune des réponses fournies n'est complète ou autonome, donc après avoir creusé mon chemin à travers ce marais, voici les étapes que je pense nécessaires pour que l'exigence (tout à fait évidente) d'une mise à jour fonctionne:
Assurez-vous que votre ID de produit change à chaque génération. Si vous ne le faites pas, vous obtiendrez toujours le message "déjà installé" que l'OP a mentionné.
<Product Id="*" ...>
Changez la version du produit chaque fois que le produit lui-même change. Je suppose que la meilleure option est de le lier à une version d'assembly (qui devrait également être auto-incrémentée), mais bien sûr, vous pouvez également le modifier manuellement. Cette étape n'est pas strictement requise si vous utilisez l'attribut AllowSameVersionUpgrades au point 4, mais j'ose dire que garder la version de votre produit constante est une mauvaise pratique dans tous les cas.
<Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
<File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
Gardez votre UpgradeCode constant (par exemple):
<Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
Ajoutez l'élément MajorUpgrade (à partir de Wix 3.5.1315.0). Pour contourner la capture selon laquelle MajorUpgrade ignorera les modifications du numéro de révision de la version du produit, ajoutez l'attribut AllowSameVersionUpgrades (ou si vous préférez AllowDowngrades). De cette façon, vous pourrez mettre à niveau par exemple 1.0.0.7
à 1.0.0.8
. et pas seulement de 1.0.7.0
à 1.0.8.0
. Si vous ne le faites pas, vous pouvez voir plusieurs installations dans Programmes et fonctionnalités.
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
Voici tout mon fichier .wix (les parties pertinentes, les deux fragments qui mènent à l'assemblage qui est utilisé pour la liaison du produit sont principalement facultatifs et à titre d'illustration, toute façon dont vous pouvez obtenir l'assemblage fonctionnera):
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
<?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>
<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.Microsoft.com/wix/NetFxExtension">
<Product
Id="*"
Name="My Product's name"
Language="1033"
Version="$(var.ProductVersion)"
Manufacturer="My company"
UpgradeCode="$(var.UpgradeCode)"
Codepage="1252">
<Package
InstallerVersion="200"
Compressed="yes"
InstallScope="perUser"
Description="My product description"
Manufacturer="My company"
Languages="1033"
SummaryCodepage="1252"
InstallPrivileges="limited" />
<MajorUpgrade AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." />
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="LocalAppDataFolder">
<Directory Id="INSTALLFOLDER" Name="My Install Dir" >
<Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" >
<RemoveFolder On="both" Id="INSTALLFOLDER"/>
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="My Registry value" />
</Component>
</Directory>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" >
<Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" >
<File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
J'ai vérifié tous les messages mentionnés ci-dessus et encore a passé des siècles à essayer de faire fonctionner cela.
Le conseil sur le HOWTO officiel pour les mises à nivea à l'étape 3 a beaucoup aidé: vous avez besoin d'un nouveau Product/@Id
pour désactiver le message "Une autre version de ce produit est déjà installée".
J'ai utilisé cette section de mise à niveau (enfant du produit):
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="1.0.0"
IncludeMinimum="yes"
OnlyDetect="no"
Maximum="$(var.Version)"
IncludeMaximum="no"
Property="PREVIOUSFOUND" />
</Upgrade>
Notez que OnlyDetect
est défini sur "non". Cela déclenche la suppression de l'ancienne version, si vous avez la section suivante (enfant du produit):
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>
Notez également qu'apparemment, seuls les trois premiers composants du numéro de version sont utilisés pour vérifier les mises à niveau ...
Vous devez utiliser la table de mise à niveau:
<Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'>
<UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.0.0.0' />
</Upgrade>
Vous devez également ajouter une action:
<InstallExecuteSequence>
<LaunchConditions After='AppSearch' />
<RemoveExistingProducts After='InstallValidate' />
</InstallExecuteSequence>
J'ai essayé cela et cela a fonctionné pour moi.
Identifiant du produit = "*" Nom = "Quelque chose" Langue = "1033" Version = "1.0.0.0" Fabricant = "Quelqu'un" UpgradeCode = "43ab28d7-6681-4a05-a6b5-f980733aeeed"
L'ID de produit doit être défini sur * de sorte que chaque fois que vous générez votre projet, il faut un ID différent.
MajorUpgrade AllowDowngrades = "no" DowngradeErrorMessage = "Une version plus récente de [ProductName] est déjà installée." AllowSameVersionUpgrades = "yes" /
Ainsi, chaque fois que vous mettez à jour votre version (ou que votre version est la même, pas moins que la version actuelle), elle réinstalle votre produit en supprimant les fichiers précédents et en installant les fichiers du produit. Il ne rétrogradera pas votre produit.