2010-03-14 17 views

risposta

5

ho sicuro che qualcuno si presenti con una risposta adeguata, ma come un backup:

Si potrebbe avere il programma di installazione crea un file di configurazione di default, e quindi avere la vostra applicazione copia il file predefinito nel normale file di configurazione, se il normale file di configurazione non è presente. Questo fornisce anche un modo semplice per ripristinare l'applicazione ai valori predefiniti (basta eliminare il file di configurazione).

+0

Bella idea. Ma questo non funziona nel mio scenario: non posso modificare il codice dell'app. – forki23

+0

Sembra che tu abbia accettato la risposta sbagliata, amico :) Dave Andersen ha proposto una buona soluzione per il tuo caso. –

+0

@Yan Infatti, anche se in mia difesa la mia risposta è stata molto più tempestiva ... –

1

È possibile modificare il comportamento predefinito con REINSTALLMODE property. Il valore predefinito è "Reinstalla se il file è mancante o è una versione precedente", che è logicamente corretto, come per me. Ma puoi sperimentare con altri valori per trovare il comportamento che ti serve.

Spero che questo aiuti.

+2

REINSTALLMODE sembra essere una proprietà globale. Voglio solo salvare un file. – forki23

3

Questo è davvero un bug di un'applicazione, non un problema di installazione.

Non è necessario "installare" dati successivamente modificabili dall'utente, Windows Installer registra le dimensioni, la data di modifica e il valore hash dei file installati. In questo modo, se il file viene in seguito scoperto come "corrotto", può essere riparato.

Installiamo un file di configurazione predefinito che viene copiato nella configurazione utente quando non viene trovato, in questo modo Windows Installer non è mai a conoscenza della configurazione modificabile dell'utente e quindi non sostituisce.

+0

Come ho scritto sopra, sfortunatamente non riesco a correggere l'app. – forki23

+6

Informazioni sui file di configurazione che sono configurati al momento dell'installazione. Ad esempio, l'app.config o web.config con una stringa di connessione specifica per l'installazione. Cosa succede se questa stringa di connessione deve cambiare dopo l'installazione? – jcmcbeth

31

L'attributo Component @NeverOverwrite="yes" potrebbe essere la soluzione a questo problema.

Dalla documentazione di aiuto WiX:

Se questo attributo è impostato su 'sì', il programma di installazione non installare o reinstallare il componente se un file percorso tasto o una voce di registro percorso della chiave per il componente già esiste. L'applicazione si registra come client del componente. Utilizzare questo flag solo per i componenti registrati dalla tabella del Registro di sistema. Non utilizzare questo flag per i componenti registrati dalle tabelle AppId, Class, Extension, ProgId, MIME e Verb.

Component Element Documentation

+0

Bene, questa sembra essere una soluzione al problema di cui sopra, supponendo che l'applicazione non possa essere cambiata, solo l'installatore ... –

+0

Non so quanto sia pesante fare il file di configurazione nel proprio componente, o se il Registro le restrizioni sui tavoli –

+2

La pratica migliore è rendere ogni file un proprio componente. http://stackoverflow.com/questions/1602831/wix-one-file-per-component-or-several-files-per-component – jcmcbeth

8

Component/@NeverOverwrite="yes" farà questo. Ricorda semplicemente di impostare File/@KeyPath="yes" su uno o più file in modo che possa rilevare se è già presente.

Se si utilizza heat.exe per raccogliere automaticamente l'elenco di file, è possibile utilizzare il seguente foglio di stile XSLT per impostare questo attributo su ciascun componente contenente un file di configurazione (e impostare ciascun elemento File di configurazione come percorso chiave).

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
       exclude-result-prefixes="msxsl wix"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="//*[local-name()='Component']"> 
    <wix:Component Id="{@Id}" Directory="{@Directory}" Guid="{@Guid}"> 
     <xsl:if test="contains(*[local-name()='File']/@Source, '.config')"> 
     <xsl:attribute name="NeverOverwrite">yes</xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates select="@* | node()"/> 
    </wix:Component> 
    </xsl:template> 

    <xsl:template match="@KeyPath"> 
    <xsl:choose> 
     <xsl:when test="contains(parent::node()/@Source, '.config')"> 
     <xsl:attribute name="KeyPath"> 
      <xsl:value-of select="'yes'"/> 
     </xsl:attribute> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

(Nota: la gestione namespace XML può probabilmente essere ripulito, ma funziona.)