2010-02-15 7 views
15

Je me bats pour activer la fonctionnalité de mise à niveau majeure dans WiX. Je veux que chaque nouvelle version du programme d'installation soit une mise à jour majeure (désinstallation complète, puis nouvelle installation) car nous ne voulons pas de versions différentes de mise à niveau et d'installation propre.Comment faire fonctionner la mise à jour WiX majeure?

J'ai commencé à essayer de le faire en utilisant le tag, mais j'ai continué à recevoir "Une autre version est installée". Message d'erreur lorsque j'exécute le programme d'installation J'ai donc implémenté la nouvelle balise qui a été ajoutée dans la version 3.5 pour faciliter les mises à jour. Je recevais toujours le message d'erreur.

J'ai ensuite lu quelque part que vous devez modifier le GUID Id pour chaque nouvelle version. J'ai donc défini Id = "*" pour que WiX les génère. Maintenant, lorsque j'installe la nouvelle version, elle ne désinstalle pas l'ancienne version, et vous obtenez deux installations dans le même dossier. J'ai travaillé cela parce que l'exécution de MSI (nouveau ou ancien) ferait apparaître l'écran de réparation/suppression.

Le programme n'a pas non plus été remplacé par la nouvelle version.

Voici le début de mon script Wix:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Id="*" 
      Name="Foo" 
      Language="1033" 
      Codepage="1252" 
      Version="!(bind.FileVersion.Foo.exe)" 
      Manufacturer="Foo Bar Ltd." 
      UpgradeCode="dac2fab2-7d76-4e47-b25f-0748380dab81"> 

     <Package 
       Description="Foo" 
       Comments="This installer database contains the logic and data required to install Foo." 
       InstallerVersion="300" 
       Languages="1033" 
       SummaryCodepage="1252" 
       Platform="x86" 
       Compressed="yes" /> 

     <!-- Remove older versions --> 
     <!-- Important note: MSI ignores the last version digit 1.0.0.? when comparing versions, so always change at least the 3rd digit for new external releases--> 
     <MajorUpgrade DowngradeErrorMessage="The version currently installed is newer than the version you are attempting to install."/> 

Répondre

20

Voici un extrait de ce que je l'utilise pour tous mes paquets, raffinés sur de nombreuses versions internes et publiques

<Product Id="*" 
     UpgradeCode="$(var.Property_UpgradeCode)" 
     Name="!(loc.ApplicationName)" 
     Language="!(loc.Property_ProductLanguage)" 
     Version="$(var.version)" 
     Manufacturer="!(loc.ManufacturerName)" > 

    <Package Description="!(loc.Package_Description) $(var.version)" 
      Comments="!(loc.Package_Comments)" 
      Manufacturer="!(loc.ManufacturerName)" 
      InstallerVersion="301" 
      Compressed="yes" 
      InstallPrivileges="elevated" 
      InstallScope="perMachine" 
      Platform="$(var.ProcessorArchitecture)" /> 

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> 

    <Upgrade Id="$(var.Property_UpgradeCode)"> 
     <UpgradeVersion OnlyDetect="yes" 
         Minimum="$(var.version)" 
         Property="NEWERVERSIONDETECTED" 
         IncludeMinimum="no" /> 

     <UpgradeVersion OnlyDetect="no" 
         Maximum="$(var.version)" 
         Property="OLDERVERSIONBEINGUPGRADED" 
         IncludeMaximum="no" /> 

     <!-- Detect for changes in 4th field only --> 
     <UpgradeVersion Property="ANOTHERBUILDINSTALLED" 
       Maximum="$(var.version)" Minimum="$(var.version)" 
       IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" /> 

    </Upgrade> 

    <CustomAction Id="CA_BlockOlderVersionInstall" Error="!(loc.LaunchCondition_LaterVersion)" /> 
    <CustomAction Id="CA_BlockAnotherBuildInstall" Error="!(loc.LaunchCondition_AnotherBuild)" /> 

    <InstallExecuteSequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 

     <!-- Schedule RemoveExistingProducts early --> 
     <RemoveExistingProducts After="InstallInitialize" /> 
    </InstallExecuteSequence> 

    <InstallUISequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 
    </InstallUISequence> 

    <!-- .... --> 

</Product> 
1

Je sais que ce poste est vieux et a répondu, mais, au cas où quelqu'un court à travers cela, j'ai eu des problèmes avec mon installateur de mise à niveau. Les sections de mise à niveau étaient très bien. Le programme d'installation s'exécute, mais la version précédente n'a jamais été supprimée. Par conséquent, la nouvelle version n'a pas été installée. La question était ce

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0"> 

Le niveau = "0" ci-dessus, aurait dû niveau = "1" comme il est ci-dessous:

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1"> 

Scott

1

Si elle est d'une quelconque utilité ceux qui découvrent ce fil, j'ai aussi rencontré un problème similaire que je viens de résoudre. Dans mon cas (et étant encore aux premiers stades du développement de mon installateur), la différence essentielle était que, d'une version à l'autre, je passais d'une installation par utilisateur à une installation par machine. Plus précisément, j'ajouté la ligne suivante à mes Product.wxs:

<Property Id='ALLUSERS' Value='1'/> 

Je reçois toujours ma tête autour de la plupart des idiosyncrasies de Windows Installer, mais je suppose que par commutation du type de une telle installation serait comparable au passage à un flux mutuellement exclusif de versioning de plusieurs façons (permettant même d'installer deux versions identiques en parallèle!).

Il est dommage que le Panneau de configuration de Windows ne distingue pas clairement les installations par utilisateur et par utilisateur.

Questions connexes