WiX - faire une mise à niveau majeure sur une installation multi instance

donc, j'ai un service windows qui peut avoir plusieurs instances installées sur un seul serveur. L'installateur doit pouvoir mettre à jour une seule instance. L'installateur utilise des transformations D'Instance, mais je ne sais pas comment faire fonctionner les mises à jour majeures comme je le voudrais.

pour une mise à niveau majeure, je comprends que je devrais avoir le changement de Code produit, donc les instances sont définies sous cette forme:

<Instance ProductCode="*"
            UpgradeCode="{SOMEGUID}"
            ProductName="Instance 1"
            Id="Instance1"/>

le msi peut être lancé pour installer une nouvelle instance par:

msiexec.exe /i "installer.msi" TRANSFORMS=:Instance1 MSINEWINSTANCE=1

cependant, après beaucoup de recherches la seule façon que j'ai trouvé pour exécuter une mise à jour sur une instance spécifique Est ce format:

msiexec.exe /i "installer.msi" /n {PRODUCTCODE} REINSTALL=ALL REINSTALLMODE=vamus

le problème avec cela est que si le code produit est autogénéré pour les mises à niveau majeures, alors je ne sais pas ce que c'est, donc je ne peux pas passer aux arguments de commande.

est-il possible de lancer une mise à niveau en utilisant le code de mise à niveau de l'Instance ou InstanceID à la place ou ProductCode? Depuis la fois de ceux qui vont rester statique. Alternativement, puis-je lancer le msi sans arguments, choisir une instance existante (via le registre de vérification) dans la boîte de dialogue de L'interface utilisateur, et définir les propriétés appropriées pour forcer le Msi à passer en mode de mise à niveau pour cette instance?

5
demandé sur Stein Åsmul 2014-04-04 14:46:31

2 réponses

voici ce que j'ai fait jusqu'à présent pour gérer 3 Mises à niveau d'instances distinctes:

<InstanceTransforms Property="Upgrade">
  <Instance Id="I01" ProductCode="*"  ProductName="Product Instance 1" UpgradeCode="55a25a09-5979-438d-91dd-67755012a288"/>
  <Instance Id="I02" ProductCode="*" ProductName="Product Instance 2" UpgradeCode="a27eb2e5-9aa8-4d09-b6c0-df717875c310"/>
  <Instance Id="I03" ProductCode="*" ProductName="Product Instance 3" UpgradeCode="d705720d-3703-4b17-817e-bd51edd9abea"/>
</InstanceTransforms>

pendant que ma mise à niveau de propriété est une Guid fixe. Avec ceci, je peux gérer 3 instances avec leurs mises à jour séparément en utilisant cette ligne -pour les nouvelles installations, ajouter MSINEINSTANCE=1 -:

msiexec / i Maproduit.MSI MSINEWINSTANCE=1 Transforms=": I01 "

1
répondu makertoo 2016-12-26 09:16:26

assez sûr que vous avez besoin du code de produit pour cela depuis le code de mise à niveau identifie une famille de produits , et pas un seul.

allumer PowerShell et exécuter cette commande pour obtenir une liste de produits installés avec le code de produit :

Get-WmiObject -Class win32_product

Voici une autre façon d'obtenir la sortie dans un format tabulaire (le numéro D'identification est le code du produit):

Get-WmiObject Win32_Product | Format-Table IdentifyingNumber, Name, Version

vous pouvez également trouver le code de produit dans le tableau de propriétés du MSI compilé en utilisant Orca ( outil SDK MSI ):

enter image description here

8
répondu Stein Åsmul 2014-06-21 20:35:50