2008-09-11 27 views
28

Comment puis-je effectuer une mise à niveau majeure vers un jeu d'installation (MSI) construit avec WiX installer dans le même dossier que l'installation d'origine?Mettre à niveau le jeu d'installation WiX vers le même dossier

L'installation est correctement détectée comme une mise à niveau, mais l'écran de sélection du répertoire est toujours affiché et avec la valeur par défaut (pas nécessairement le dossier d'installation actuel). Dois-je effectuer un travail manuel comme enregistrer le dossier d'installation dans une clé de registre lors de la première installation, puis lire cette clé lors de la mise à niveau? Si oui, y a-t-il un exemple?

Ou y a-t-il un moyen plus simple d'y parvenir en MSI ou WiX?

Comme référence, je mon fichier en cours de Wix est ci-dessous:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"> 
    <Product Id="a2298d1d-ba60-4c4d-92e3-a77413f54a53" 
      Name="MyCompany Integration Framework 1.0.0" 
      Language="1033" 
      Version="1.0.0" 
      Manufacturer="MyCompany" 
      UpgradeCode="9071eacc-9b5a-48e3-bb90-8064d2b2c45d"> 

     <!-- Package information --> 
     <Package Keywords="Installer" 
       Id="e85e6190-1cd4-49f5-8924-9da5fcb8aee8" 
       Description="Installs MyCompany Integration Framework 1.0.0" 
       Comments="Installs MyCompany Integration Framework 1.0.0" 
       InstallerVersion="100" 
       Compressed="yes" /> 

     <Upgrade Id='9071eacc-9b5a-48e3-bb90-8064d2b2c45d'> 
      <UpgradeVersion Property="PATCHFOUND" 
          OnlyDetect="no" 
          Minimum="0.0.1" 
          IncludeMinimum="yes" 
          Maximum="1.0.0" 
          IncludeMaximum="yes"/> 
     </Upgrade> 

     <!-- Useless but necessary... --> 
     <Media Id="1" Cabinet="MyCompany.cab" EmbedCab="yes" /> 

     <!-- Precondition: .NET 2 must be installed --> 
     <Condition Message='This setup requires the .NET Framework 2 or higher.'> 
      <![CDATA[MsiNetAssemblySupport >= "2.0.50727"]]> 
     </Condition> 

     <Directory Id="TARGETDIR" 
        Name="SourceDir"> 
      <Directory Id="MyCompany" 
         Name="MyCompany"> 
       <Directory Id="INSTALLDIR" 
          Name="Integrat" 
          LongName="MyCompany Integration Framework"> 
        <Component Id="MyCompanyDllComponent" 
           Guid="4f362043-03a0-472d-a84f-896522ce7d2b" 
           DiskId="1"> 
         <File Id="MyCompanyIntegrationDll" 
           Name="IbIntegr.dll" 
           src="..\Build\MyCompany.Integration.dll" 
           Vital="yes" 
           LongName="MyCompany.Integration.dll" /> 
         <File Id="MyCompanyServiceModelDll" 
           Name="IbSerMod.dll" 
           src="..\Build\MyCompany.ServiceModel.dll" 
           Vital="yes" 
           LongName="MyCompany.ServiceModel.dll" /> 
        </Component> 

        <!-- More components --> 
       </Directory> 
      </Directory> 
     </Directory> 

     <Feature Id="MyCompanyProductFeature" 
       Title='MyCompany Integration Framework' 
       Description='The complete package' 
       Display='expand' 
       Level="1" 
       InstallDefault='local' 
       ConfigurableDirectory="INSTALLDIR"> 
      <ComponentRef Id="MyCompanyDllComponent" /> 
     </Feature> 

     <!-- Task scheduler application. It has to be used as a property --> 
     <Property Id="finaltaskexe" 
        Value="MyCompany.Integration.Host.exe" /> 
     <Property Id="WIXUI_INSTALLDIR" 
        Value="INSTALLDIR" /> 

     <InstallExecuteSequence> 
      <!-- command must be executed: MyCompany.Integration.Host.exe /INITIALCONFIG parameters.xml --> 
      <Custom Action='PropertyAssign' 
        After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom> 
      <Custom Action='LaunchFile' 
        After='InstallFinalize'>NOT Installed AND NOT PATCHFOUND</Custom> 

      <RemoveExistingProducts Before='CostInitialize' /> 
     </InstallExecuteSequence> 

     <!-- execute comand --> 
     <CustomAction Id='PropertyAssign' 
         Property='PathProperty' 
      Value='[INSTALLDIR][finaltaskexe]' /> 
     <CustomAction Id='LaunchFile' 
         Property='PathProperty' 
         ExeCommand='/INITIALCONFIG "[INSTALLDIR]parameters.xml"' 
         Return='asyncNoWait' /> 

     <!-- User interface information --> 
     <UIRef Id="WixUI_InstallDir" /> 
     <UIRef Id="WixUI_ErrorProgressText" /> 
    </Product> 
</Wix> 

Répondre

31

dans le tutoriel WiX Il y a un exemple: http://wix.tramontana.co.hu/tutorial/getting-started/where-to-install

<Property Id="INSTALLDIR"> 
    <RegistrySearch Id='AcmeFoobarRegistry' Type='raw' 
    Root='HKLM' Key='Software\Acme\Foobar 1.0' Name='InstallDir' /> 
</Property> 

Bien sûr, vous devez définir la clé de Registre dans le cadre de l'installation aussi. Collez ceci à l'intérieur d'un composant qui fait partie de l'installation d'origine:

<RegistryKey 
     Key="Software\Software\Acme\Foobar 1.0" 
     Root="HKLM"> 
    <RegistryValue Id="FoobarRegInstallDir" 
      Type="string" 
      Name="InstallDir" 
      Value="[INSTALLDIR]" /> 
</RegistryKey> 
+0

J'ai implémenté ceci et cela fonctionne. Merci mon pote. –

+1

le lien au tutoriel a changé pour: http://wix.tramontana.co.hu/tutorial/getting-started/where-to-install – marcin

+0

Merci pour cela, j'ai eu la mauvaise idée qu'une seule clé a été utilisée et a été mis à jour par chaque installateur. Vous m'avez montré l'erreur de mes manières: P – TheGateKeeper

5

Le 'registre' est obsolète. Maintenant, cette partie du code devrait ressembler à ceci:

<RegistryKey Id="FoobarRegRoot" 
      Action="createAndRemoveOnUninstall" 
      Key="Software\Software\Acme\Foobar 1.0" 
      Root="HKLM"> 
    <RegistryValue Id="FoobarRegInstallDir" 
       Type="string" 
       Name="InstallDir" 
       Value="[INSTALLDIR]" /> 
</RegistryKey> 
4

Vous avez vraiment pas besoin de séparer RegistryKey de RegistryValue dans un cas simple comme celui-ci. En outre, l'utilisation de HKMU au lieu de HKLM prend en charge si vous effectuez une installation de machine ou d'utilisateur.

<RegistryValue 
    Root="HKMU" 
    Key="Software\[Manufacturer]\[ProductName]" 
    Name="InstallDir" 
    Type="string" 
    Value="[INSTALLDIR]" 
    KeyPath="yes" /> 
+1

Points bonus pour utiliser [Fabricant ] et [ProductName] – William