2010-05-11 12 views
6

Abbiamo un programma di installazione del prodotto creato con Wix, contenente un pacchetto di programma ("V1") e alcuni file di configurazione. Ora, effettueremo un importante aggiornamento con un nuovo codice prodotto, in cui è stata disinstallata la vecchia versione del prodotto e "V2" è installato. Quello che vogliamo è salvare uno dei file di configurazione dalla disinstallazione, poiché è necessario anche per il V2. Purtroppo, abbiamo dimenticato di impostare l'opzione Permanent="yes" quando abbiamo consegnato V1 (read this question per ulteriori informazioni).WiX, come impedire la disinstallazione dei file anche se ci siamo dimenticati di impostare Permanent = "yes"

Ecco la domanda: c'è un modo semplice per impedire la disinstallazione del file in ogni caso? Naturalmente, potremmo aggiungere un'azione personalizzata allo script per eseguire il backup del file prima della disinstallazione e un'altra azione personalizzata per ripristinarla in seguito, ma IMHO sembra essere eccessivo per questa attività e potrebbe interferire con altre parti del processo di registrazione MSI .

EDIT: E sì, l'attributo NeverOverwrite="yes" è già impostato in V2 e il comportamento è come l'ho descritto.

Non penso che possa aiutare a modificare qualcosa direttamente nei parametri del componente di V2. Forse c'è la possibilità di modificare il registro in qualche modo in un'azione personalizzata prima di disinstallare V1 in modo che il servizio di installazione pensi che il file di configurazione in V1 sia stato installato con Permanent="yes"?

+0

Non riesci a reinstallare quei file, o è necessario conservare il file locale perché potrebbero essere stati modificati? –

+0

Questo è esattamente il caso: il file di configurazione potrebbe essere stato modificato e dovrebbe essere mantenuto così com'è. –

risposta

5

Prova l'attributo NeverOverwrite per il file di configurazione

Se questo attributo è impostato su 'sì', il programma di installazione non installa o reinstallare il componente se una chiave di file percorso o un Registro di sistema percorso della chiave voce per il componente esiste già.

EDIT

Ho appena testato questo in una configurazione di prova. All'inizio non ha funzionato perché avevo programmato l'azione RemoveExistingProducts prima della sequenza InstallInitialize. Ciò rimuove il vecchio prodotto prima che il nuovo prodotto sia installato, quindi non può essere confrontato.

Tuttavia, quando ho impostato su dopo InstallFinalize ha funzionato, ha lasciato il file lì anche se la configurazione originale non ha impostato NeverOverwrite. qui sono i miei due esempi di test

versione 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> 

versione 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

Potrebbe non funzionare se si ha RemoveExistingProducts nell'ordine errato –

+0

No, non sembra funzionare (avevamo già ) in V1 e V2. Sei sicuro di aver usato un ambiente pulito per i tuoi test, cioè una macchina virtuale? –

+0

Sto usando la versione 3.5, quale versione stai usando? Non dovrebbe fare la differenza, ma potrebbe! Inoltre, se si compilano entrambi gli esempi, installare prima il secondo, il file non viene sostituito. Qualcuno di questi file viene sostituito in un componente per utente? –

0

Il modo in cui sto risoluzione di questo è molto semplice. Non installo i file appapp.config ma solo yourapp.config.new Alla prima esecuzione l'applicazione prima di eseguire qualsiasi altra operazione controlla il file di configurazione. Se non ce ne sono, fai una copia yourapp.config.new a yourapp.config

Questo è molto semplice, non usa attributi speciali. Quando l'applicazione viene disinstallata, il file di configurazione non viene disinstallato. Quando l'applicazione viene reinstallata il file è disturbato. Si noti che quando l'applicazione viene riparata anche la configurazione non viene modificata.

+0

Bene, la tua risposta manca due punti della domanda. Innanzitutto, la domanda riguarda un sistema già distribuito. Lasciando che il programma di installazione rimuova il file di configurazione (anche quando l'applicazione V2.0 potrebbe crearne uno nuovo) getta via le informazioni che un amministratore ha inserito manualmente lì, che è ciò che volevo evitare. In secondo luogo, stavo parlando di un file di configurazione che risiede nella directory 'Program', dove nella maggior parte degli ambienti aziendali sono necessari i diritti di accesso amministrativo per scrivere qualcosa lì, che ha il programma di installazione, ma non un programma" normale ". –

Problemi correlati