web-dev-qa-db-fra.com

Comment puis-je faire en sorte qu'un MIX WIX supprime toujours une version précédente?

J'ai le système de construction CI construit un MSI chaque fois qu'un développeur vérifie un changement. Nous effectuons des tests d'acceptation automatisés sur le MSI installé.

Fondamentalement, chaque MSI est une installation complète du produit, nous n'avons donc pas de version (en tant qu'installateur Windows) en soi.

Chaque MSI a le même produit GUID et mise à niveau GUID, et le même numéro de version. Mais a un package différent GUID (utilisez '*' dans Wix).

Ce que je veux réaliser, c'est que lorsque le programme d'installation s'exécute, il "désinstalle" toute version précédemment installée du produit, et installe la nouvelle .. le tout à partir d'un seul MSI (Nous avons un processus d'installation compliqué qui est hors de notre contrôle .. citrix et sccm, nous voulons donc leur donner un chemin d'installation simple)

J'ai essayé:

<Property Id='PREVIOUSVERSIONSINSTALLED' Secure='yes' />
<Upgrade Id='$UPGRADE_GUID'>  
  <UpgradeVersion Minimum='1.0.0.0'
                  Maximum='99.0.0.0'
                  Property='PREVIOUSVERSIONSINSTALLED'
                  IncludeMinimum='yes'
                  IncludeMaximum='no' />
</Upgrade>

et avoir:

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

et ont essayé:

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

Mais lorsque j'essaie d'installer un msi à partir d'une version ultérieure, j'obtiens:

Another version of this product is already installed. Installation of this version cannot continue. 
To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel. 

Ce qui n'est pas vraiment ce que j'allais faire ..

Je comprends que je peux simplement mettre à jour l'attribut Version dans la balise produit, mais cela devient difficile à gérer. Tout d'abord, je peux produire plus de 20 versions msi par jour, car j'ai un certain nombre de pipelines de génération qui produisent des MSI et je ne sais pas comment gérer la numérotation des versions d'une manière sensée.

Peut-être que Windows Installer n'autorise tout simplement pas ce type d'installation "toujours remplacer la version installée"?

20
grillp

J'ai donc trouvé un moyen de le faire sans changer le numéro de version.

Je change le produit GUID avec chaque build, mais je garde la mise à niveau GUID identique).

J'ai également dû changer les RemoveExistingProducts en Before = 'InstallInitialize'. Sinon, il n'a laissé que les "deltas" entre les générations dans le chemin d'installation.

Comme indiqué par Wim ci-dessous, je peux remplacer le produit généré GUID par '*'.

20
grillp

Vous pouvez utiliser ce code pour supprimer l'ancienne version et en installer une plus récente:

<Product Id="*"
         UpgradeCode="87795f3dc95-81f5-473e-955e-2871a5bd66a5"
         Name="AppName"
         Language="1033"
         Version="1.0.6"
         Manufacturer="Manufacturer Name">
  <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
  <MajorUpgrade Schedule="afterInstallInitialize"
                DowngradeErrorMessage="A later version of [ProductName] is already installed"
                AllowSameVersionUpgrades="yes" />
</Product>
12
aa aa

essayer

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

Cela devrait supprimer tous les produits existants une fois l'installation terminée, mais vous pouvez personnaliser le moment auquel vous le faites

voir http://mohundro.com/blog/2009/02/23/getting-started-with-wix-and-major-upgrades/

voir aussi la réponse acceptée pour cette question

4
Daniel Powell

Si le code du produit et la version sont les mêmes mais que le code du package est différent, vous obtiendrez toujours ce message d'erreur Windows Installer.

Je suggère fortement d'inclure des informations de version pour vos installateurs dans vos builds CI. Si vous installez puis mettez à niveau chaque version, la version n'est pas une mauvaise chose. Il devrait être relativement facile de l'ajouter à une build CI.

4
BryanJ