2014-05-07 6 views
1

Mon projet doit pouvoir installer deux versions ou plus simultanément. autant que je peux trouver, la solution que j'ai trouvée change le code de mise à niveau pour chaque construction de l'installateur.wix générant un nouveau code de mise à niveau

Cependant, je veux le faire automatiquement. en GUID régulier, j'utilise simplement "*", mais cela ne fonctionnera pas pour le upgradecode. Y a-t-il un moyen de générer un nouveau code supérieur dans chaque pré-construction wix ou toute autre solution?

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> 
    <Bundle Name="Prog" Version="1.2.1.16" Manufacturer="Gilad Corporation" UpgradeCode="{7E71F945-BA46-4872-A6B2-AF992FFDF2D0}"> 
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense"> 
     <bal:WixStandardBootstrapperApplication LicenseFile="..\SetupProject\Gilad.rtf" /> 
    </BootstrapperApplicationRef> 
    <Chain> 
     <!-- TODO: Define the list of chained packages. --> 
     <PackageGroupRef Id="Netfx45FullPackage" /> 
    </Chain> 
    </Bundle> 
+0

C'est le ProductCode qui définit l'unicité d'un produit, pas le UpgradeCode. – PhilDW

+0

Ce serait bien si vous pouvez décrire pourquoi vous avez besoin de plusieurs instances. Il peut y avoir de meilleurs moyens d'y parvenir en modifiant la conception de l'application. –

+0

@Glytzhkof J'ai une application où je crée des corrections de bugs et différentes nouvelles fonctionnalités. puisque mes utilisateurs doivent être capables de travailler sur 2 versions différentes, je ne veux pas les mettre à jour. Je veux qu'ils puissent installer 2 versions ou plus côte à côte. – Gilad

Répondre

3

Je ne suis pas sûr à 100% si vous souhaitez offrir des versions différentes éditions/langue de votre application, ou si vous souhaitez installer la même configuration côte à côte plusieurs fois. On dirait que vous voulez obtenir ce dernier. Laissez-moi essayer d'expliquer brièvement les deux scénarios.

D'abord les bases:

  • package Code: identifie un fichier MSI unique, (il devrait donc toujours changer pour chaque recompilation)
  • Code produit: identifie une édition de produit unique. Les différentes saveurs du même produit (comme les éditions anglaise, allemande et française) ont tendance à avoir des codes produits différents.
  • Code de mise à niveau: identifie une famille de produits connexes. En substance, un groupe de codes de produit.

applications différentes éditions/langues: Si ce que vous voulez est d'installer une version différente de votre configuration - dire que vous livrez versions anglaise, française et allemande, vous pouvez le faire en gardant le code de mise à niveau de la pareil pour tous, mais utilisez des codes de produit et des codes de paquet différents pour chaque configuration. Cela permet à chaque installation d'en désinstaller facilement une autre si elle est déjà présente sur la machine.

Installations côte à côte: Je n'aime pas ce concept, car il tend à indiquer une erreur dans la conception de l'installation, mais le concept de «instance transforme» devrait être en mesure de réaliser ce que vous probablement se référer à.

<InstanceTransforms Property="INSTANCEID"> 
    <Instance Id="Install2" ProductCode="*" 
      UpgradeCode="guid-goes-here" ProductName="Product" /> 
</InstanceTransforms> 
+0

Je veux expliquer un peu pourquoi c'est mon design. J'ai une application avec un algorithme. l'algorithme va au matériel. donc si je veux avoir une option rétrocompatible. donc si j'installe l'application et 2 mois plus tard, je veux installer la nouvelle version et l'ancienne version côte à côte, je vais avoir l'option. – Gilad

1

Faites attention à ce que vous essayez d'accomplir. Essayez-vous d'installer plusieurs instances du même logiciel? Ou avez-vous différentes applications de ce programme qui pourraient avoir besoin d'être installé sur la même machine.

MSI n'est pas conçu pour permettre l'installation côte à côte du même logiciel.Comme @Glytzhokof l'a mentionné, vous avez trois codes distincts dans le MSI que vous devez adresser.

Habituellement, vous générez un code de mise à niveau qui ne change jamais avec la durée de vie de votre MSI. Si vous essayez d'installer deux versions d'un MSI ayant le même code de mise à niveau, vous déclenchez la logique de mise à niveau dans MSI (pour mettre à niveau une installation existante ou empêcher une annulation sauf si vous l'activez explicitement). Pour réaliser, il faudrait un produit unique, un paquet et un code de mise à niveau pour tous les logiciels (pour permettre une installation côte à côte de V1 et V2 du logiciel). Cependant, vous devez faire très attention à la façon de choisir côte à côte. J'ai vu des versions où 1.2.x ont le même code de mise à niveau, mais 1.3.x a un nouveau code de mise à niveau permettant une installation côte à côte.

On dirait que vous allez vous amuser.

3

Juste pour répondre à la « comment générer automatiquement la UpgradeCode » question, si vous utilisez msbuild, vous pouvez faire quelque chose comme ceci dans votre projet:

<PropertyGroup> 
    <NewUpgradeCode>$([System.Guid]::NewGuid())</NewUpgradeCode> 
</PropertyGroup> 

<DefineConstants>NewUpgradeCode=$(NewUpgradeCode)</DefineConstants> 

et dans le paquet:

<Bundle Name="!(bind.PackageName.Package)" 
     Version="!(bind.PackageVersion.Package)" 
     Manufacturer="!(bind.PackageManufacturer.Package)" 
     UpgradeCode="$(var.NewUpgradeCode)"> 

Je l'utilise en fait dans un ensemble semblable à un modèle pour emballer des paquets uniques, où je ne veux pas qu'ils soient associés les uns aux autres. Cependant, je veux toujours qu'ils aient un code de mise à niveau au cas où je devrais les mettre à jour plus tard.

Je ne peux pas dire si c'est la meilleure solution pour ce cas d'utilisation, mais semble fonctionner.

+0

Je l'ai utilisé avec succès, mais je ne suis pas sûr de comprendre ce que j'ai fait. Vous pouvez utiliser un noeud personnalisé dans le fichier wixproj (ici NewUpgradeCode)? et [System.Guid] :: NewGuid() est une commande powershell? –

+0

Je ne dirais pas que c'est une commande powershell, puisque powershell n'est pas invoqué, mais MSBuild est capable d'appeler les classes .NET de la même manière que powershell, et utilise une syntaxe similaire. Tout ce qu'il fait génère un guid aléatoire et le transmet en tant que WixVariable. –

Questions connexes