2010-05-11 3 views
6

Nous avons un programme d'installation de produit créé avec Wix, contenant un package de programme ("V1") et quelques fichiers de configuration. Maintenant, nous allons faire une mise à jour majeure avec un nouveau code de produit, où l'ancienne version du produit est désinstallée et « V2 » est installé. Ce que nous voulons, c'est sauver l'un des fichiers de configuration de la désinstallation, puisqu'il est également nécessaire pour la V2. Malheureusement, nous avons oublié de définir l'option Permanent="yes" lorsque nous avons livré V1 (read this question pour plus d'informations).WiX, comment empêcher la désinstallation des fichiers mais nous avons oublié de définir Permanent = "yes"

Voici la question: est-il un moyen facile d'empêcher la désinstallation du fichier de toute façon? Bien sûr, nous pourrions ajouter une action personnalisée au script pour sauvegarder le fichier avant la désinstallation, et une autre action personnalisée pour restaurer plus tard, mais à mon humble avis qui semble être surpuissant pour cette tâche, et elle pourrait interférer avec d'autres parties du processus d'enregistrement MSI .

EDIT: Et oui, l'attribut NeverOverwrite="yes" est déjà défini dans V2 et le comportement est tel que je l'ai décrit.

Je ne pense pas que cela va aider à changer quelque chose directement dans les paramètres du composant de V2. Peut-être il y a une chance de modifier le registre en quelque sorte dans une action personnalisée avant de désinstaller V1, donc le service d'installation pense que le fichier de configuration dans V1 a été installé avec Permanent="yes"?

+0

Vous pouvez simplement réinstaller ces fichiers, ou est-ce que vous voulez conserver le fichier local parce qu'il a peut-être été modifié? –

+0

C'est exactement le cas - le fichier de configuration a peut-être été modifié et devrait être conservé tel quel. –

Répondre

5

Essayez l'attribut NeverOverwrite pour le fichier de configuration

Si cet attribut est réglé sur « oui », le programme d'installation ne pas installer ou réinstaller le composant si un chemin de clé fichier ou un registre de chemin de clé entrée pour le composant existe déjà.

EDIT

Je viens testé dans une configuration de test. Au début, il ne fonctionne pas parce que je l'avais prévu avant l'action RemoveExistingProductsInstallInitialize séquence. Cela supprime l'ancien produit avant l'installation du nouveau produit afin qu'il ne puisse pas être comparé.

Cependant quand je l'ai placé après InstallFinalize cela a fonctionné, il a laissé le dossier là même si la configuration originale n'avait pas NeverOverwrite ensemble. voici mes deux exemples de test

Version 1.0.0.0

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="35d07bf8-a729-402d-83d6-fdc55799a3d5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.0.0"> 
     <Package Compressed="no" InstallerVersion="200" /> 
     <Property Id="ALLUSERS" Value="1" /> 
     <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a"> 
      <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.0.0" IncludeMaximum="no" /> 
      <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.0.0" IncludeMinimum="no" /> 
     </Upgrade> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder"> 
       <Directory Id="INSTALLDIR" Name="test1"> 
        <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature"> 
         <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" /> 
        </Component> 
       </Directory> 
      </Directory> 
     </Directory> 
     <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" /> 
     <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" /> 
     <InstallExecuteSequence> 
      <Custom Action="NewerFound" After="FindRelatedProducts">NEWERFOUND</Custom> 
      <RemoveExistingProducts After="InstallFinalize" /> 
     </InstallExecuteSequence> 
     <UIRef Id="WixUI_Minimal" /> 
     <Media Id="1" /> 
     <UI /> 
    </Product> 
</Wix> 

Version 1.0.1.0

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="1da36626-d760-4c4c-8a5c-3eb3841dbfd5" Language="1033" Manufacturer="..." Name="test1" UpgradeCode="9773a278-068d-4fac-8241-4a5b7e54f15a" Version="1.0.1.0"> 
     <Package Compressed="no" InstallerVersion="200" /> 
     <Property Id="ALLUSERS" Value="1" /> 
     <Upgrade Id="9773a278-068d-4fac-8241-4a5b7e54f15a"> 
      <UpgradeVersion OnlyDetect="no" Property="REMOVEOLDVERSION" Maximum="1.0.1.0" IncludeMaximum="no" /> 
      <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="1.0.1.0" IncludeMinimum="no" /> 
     </Upgrade> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder"> 
       <Directory Id="INSTALLDIR" Name="test1"> 
        <Component Id="New_Text_Document.txt" Guid="{CCA38D83-A890-4528-B11D-DA2E2DCDED93}" Feature="ProductFeature" NeverOverwrite="yes"> 
         <File Id="New_Text_Document.txt" KeyPath="yes" Source="Harvest\ProgramFilesFolder\INSTALLDIR\New Text Document.txt" /> 
        </Component> 
       </Directory> 
      </Directory> 
     </Directory> 
     <Feature Id="ProductFeature" Level="1" Title="CompletePackage" Description="The complete Product." Display="expand" /> 
     <CustomAction Id="NewerFound" Error="A later version of [ProductName] is already installed" /> 
     <InstallExecuteSequence> 
      <Custom Action="NewerFound" After="FindRelatedProducts"> 
NEWERFOUND</Custom> 
      <RemoveExistingProducts After="InstallFinalize" /> 
     </InstallExecuteSequence> 
     <UIRef Id="WixUI_Minimal" /> 
     <Media Id="1" /> 
     <UI /> 
    </Product> 
</Wix> 
+1

Cela peut ne pas fonctionner si vous avez RemoveExistingProducts dans le mauvais ordre –

+0

Non, cela ne semble pas fonctionner aussi (nous avions déjà ) dans V1 et V2. Êtes-vous sûr d'avoir utilisé un environnement propre pour vos tests, c'est-à-dire une machine virtuelle? –

+0

J'utilise la version 3.5, quelle version utilisez-vous? Il ne devrait pas faire une différence, mais il pourrait! Aussi, si vous compilez ces deux exemples, installez le premier puis le second le fichier ne sera pas remplacé. Certains de ces fichiers sont-ils remplacés dans un composant par utilisateur? –

0

La façon dont je suis la fixation de c'est très simple. Je n'installe pas vos fichiers appl.config mais seulement votreapp.config.new Lors de la première exécution, l'application avant toute chose vérifie le fichier de configuration. S'il n'y en a aucune, faites une copie de votreapplication.config.new à votreapp.config

Ceci est très simple, il n'utilise pas d'attributs spéciaux. Lorsque l'application est désinstallée, le fichier de configuration n'est pas désinstallé. Lorsque l'application est réinstallée, le fichier est perturbé. Notez que lorsque l'application est réparée, la configuration n'est pas modifiée non plus.

+0

Eh bien, votre réponse manque deux points de la question. Premièrement, la question concerne un système déjà déployé. Laisser le programme d'installation enlever le fichier de configuration (même quand l'application V2.0 pourrait en créer une nouvelle) jette toutes les informations qu'un administrateur a saisies manuellement, ce que je voulais éviter. Deuxièmement, je parlais d'un fichier de configuration qui réside dans le répertoire 'Program', où dans la plupart des environnements d'entreprise, vous avez besoin de droits d'accès administratifs pour écrire quoi que ce soit, mais pas un programme" normal ". –

Questions connexes