2010-05-04 5 views
5

ARGH! Wix macht mich verrückt.Bleiben Sie bei der Erhaltung Konfigurationsdatei in WIX Hauptaktualisierung!

So, natürlich habe ich die vielen Beiträge sowohl hier auf stackoverflow und anderswo über WiX und wichtige Upgrades gesehen. Ich habe dieses Softwareprojekt mit WiX geerbt und eine neue Version veröffentlicht. Ich brauche diese neue Version, um NUR die eine Konfigurationsdatei zu lassen, wenn sie vorhanden ist, und alles andere zu ersetzen. Dieser Installer funktioniert EXCEPT, egal was ich bisher gemacht habe, die neue XML-Datei ersetzt die alte bei jeder Installation. Selbst wenn man versucht, NeverOverwrite = "yes" zu verwenden und sogar mit OnlyDetect = "no" vor und zurück zu spielen! Ich stecke einfach fest und bitte demütig um eine kleine Führung. Die Datei, die beibehalten werden muss, heißt SETTINGS.XML und befindet sich im Verzeichnis All Users -> ApplicationData. Hier ist (am meisten) meine .wxs-Datei!

<Package Id='$(var.PackageCode)' 
      Description="Pathways Directory Software" 
      InstallerVersion="301" 
      Compressed="yes" /> 

    <WixVariable Id="WixUILicenseRtf" Value="License.rtf" /> 
    <Media Id="1" Cabinet="Pathways.cab" EmbedCab="yes" /> 

    <Upgrade Id="$(var.UpgradeCode)"> 
     <UpgradeVersion 
      OnlyDetect="no" 
      Maximum="$(var.ProductVersion)" 
      IncludeMaximum="no" 
      Language="1033" 
      Property="OLDAPPFOUND" 
     /> 
     <UpgradeVersion 
      Minimum="$(var.ProductVersion)" 
      IncludeMinimum="yes" 
      OnlyDetect="no" 
      Language="1033" 
      Property="NEWAPPFOUND" 
     /> 
    </Upgrade> 

 <!-- program files directory --> 
     <Directory Id="ProgramFilesFolder"> 
      <Directory Id="INSTALLDIR" Name="Pathways"/> 
     </Directory> 

     <!-- application data directory --> 
     <Directory Id="CommonAppDataFolder" Name="CommonAppData"> 
      <Directory Id="CommonAppDataPathways" Name="Pathways" /> 
     </Directory> 

     <!-- start menu program directory --> 
     <Directory Id="ProgramMenuFolder"> 
      <Directory Id="ProgramsMenuPathwaysFolder" Name="Pathways" /> 
     </Directory> 

     <!-- desktop directory --> 
     <Directory Id="DesktopFolder" /> 

    </Directory> 

    <Icon Id="PathwaysIcon" SourceFile="\\Fileserver\Release\Pathways\Latest\Release\Pathways.exe" /> 

    <!-- components in the reference to the install directory --> 
    <DirectoryRef Id="INSTALLDIR"> 
     <Component Id="Application" Guid="EEE4EB55-A515-4872-A4A5-06D6AB4A06A6"> 
      <File Id="pathwaysExe" Name="Pathways.exe" DiskId="1" Source="\\Fileserver\Release\Pathways\Latest\Release\Pathways.exe" Vital="yes" KeyPath="yes" Assembly=".net" AssemblyApplication="pathwaysExe" AssemblyManifest="pathwaysExe"> 
       <!--<netfx:NativeImage Id="ngen_Pathways.exe" Platform="32bit" Priority="2"/> --> 
      </File> 

      <File Id="pathwaysChm" Name="Pathways.chm" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Pathways.chm" /> 

      <File Id="publicKeyXml" ShortName="RSAPUBLI.XML" Name="RSAPublicKey.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\RSAPublicKey.xml" Vital="yes" /> 
      <File Id="staticListsXml" ShortName="STATICLI.XML" Name="StaticLists.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\StaticLists.xml" Vital="yes" /> 

      <File Id="axInteropMapPointDll" ShortName="AXMPOINT.DLL" Name="AxInterop.MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\AxInterop.MapPoint.dll" Vital="yes" /> 
      <File Id="interopMapPointDll" ShortName="INMPOINT.DLL" Name="Interop.MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Interop.MapPoint.dll" Vital="yes" /> 
      <File Id="mapPointDll" ShortName="MAPPOINT.DLL" Name="MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Interop.MapPoint.dll" Vital="yes" /> 

      <File Id="devExpressData63Dll" ShortName="DAAT63.DLL" Name="DevExpress.Data.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.Data.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressUtils63Dll" ShortName="UTILS63.DLL" Name="DevExpress.Utils.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.Utils.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraBars63Dll" ShortName="BARS63.DLL" Name="DevExpress.XtraBars.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraBars.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraNavBar63Dll" ShortName="NAVBAR63.DLL" Name="DevExpress.XtraNavBar.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraNavBar.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraCharts63Dll" ShortName="CHARTS63.DLL" Name="DevExpress.XtraCharts.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraCharts.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraEditors63Dll" ShortName="EDITOR63.DLL" Name="DevExpress.XtraEditors.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraEditors.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraPrinting63Dll" ShortName="PRINT63.DLL" Name="DevExpress.XtraPrinting.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraPrinting.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraReports63Dll" ShortName="REPORT63.DLL" Name="DevExpress.XtraReports.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraReports.v6.3.dll" Vital="yes" /> 
      <File Id="devExpressXtraRichTextEdit63Dll" ShortName="RICHTE63.DLL" Name="DevExpress.XtraRichTextEdit.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraRichTextEdit.v6.3.dll" Vital="yes" /> 

      <RegistryValue Id="PathwaysInstallDir" Root="HKLM" Key="Software\Tribal Data Resources\Pathways" Name="InstallDir" Action="write" Type="string" Value="[INSTALLDIR]" /> 
     </Component> 

    </DirectoryRef> 

    <!-- application data components --> 
    <DirectoryRef Id="CommonAppDataPathways"> 

     <Component Id="CommonAppDataPathwaysFolderComponent" Guid="087C6F14-E87E-4B57-A7FA-C03FC8488E0D"> 
      <CreateFolder> 
       <Permission User="Everyone" GenericAll="yes" /> 
      </CreateFolder> 

      <RemoveFolder Id="CommonAppDataPathways" On="uninstall" /> 
      <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes" /> 
      <File Id="settingsXml" ShortName="SETTINGS.XML" Name="Settings.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Settings\settings.xml" Vital="yes" /> 
     </Component> 

     <Component Id="Database" Guid="1D8756EF-FD6C-49BC-8400-299492E8C65D"> 
      <File Id="pathwaysMdf" Name="Pathways.mdf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.mdf" /> 
      <RemoveFile Id="pathwaysLdf" ShortName="Pathways.ldf" Name="Pathways_log.LDF" On="uninstall" /> 
     </Component> 

    </DirectoryRef> 

    <!-- shortcut components --> 
    <DirectoryRef Id="DesktopFolder"> 
     <Component Id="DesktopShortcutComponent" Guid="1BF412BA-9C6B-460D-80ED-8388AC66703F"> 
      <Shortcut Id="DesktopShortcut" 
         Target="[INSTALLDIR]Pathways.exe" 
         Name="Pathways" 
         Description="Pathways Tribal Directory" 
         Icon="PathwaysIcon" 
         Show="normal" 
         WorkingDirectory="INSTALLDIR" /> 
      <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes"/> 
     </Component> 
    </DirectoryRef> 

    <DirectoryRef Id ="ProgramsMenuPathwaysFolder"> 
     <Component Id="ProgramsMenuShortcutComponent" Guid="83A18245-4C22-4CDC-94E0-B480F80A407D"> 
      <Shortcut Id="ProgramsMenuShortcut" Target="[INSTALLDIR]Pathways.exe" Name="Pathways" Icon="PathwaysIcon" Show="normal" WorkingDirectory="INSTALLDIR" /> 
      <RemoveFolder Id="ProgramsMenuPathwaysFolder" On="uninstall"/> 
      <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes"/> 
     </Component> 
    </DirectoryRef> 


    <Feature Id="App" Title="Pathways Application" Level="1" Description="Pathways software" Display="expand" ConfigurableDirectory="INSTALLDIR" Absent="disallow" AllowAdvertise="no" InstallDefault="local"> 
     <ComponentRef Id="Application" /> 
     <ComponentRef Id="CommonAppDataPathwaysFolderComponent" /> 
     <ComponentRef Id="ProgramsMenuShortcutComponent" /> 
     <Feature Id="Shortcuts" Title="Desktop Shortcut" Level="1" Absent="allow" AllowAdvertise="no" InstallDefault="local"> 
      <ComponentRef Id="DesktopShortcutComponent" /> 
     </Feature> 
    </Feature> 


    <Feature Id="Data" Title="Database" Level="1" Absent="allow" AllowAdvertise="no" InstallDefault="local"> 
     <ComponentRef Id="Database" /> 
    </Feature> 

    <!-- <UIRef Id="WixUI_Minimal" /> --> 
    <UIRef Id ="WixUI_FeatureTree"/> 
    <UIRef Id="WixUI_ErrorProgressText"/> 

    <UI> 
     <Error Id="2000">There is a later version of this program installed.</Error> 
    </UI> 

    <CustomAction Id="NewerVersionDetected" Error="2000" /> 

    <InstallExecuteSequence> 
     <RemoveExistingProducts After="InstallFinalize"/> 
    </InstallExecuteSequence> 

</Product> 

+1

Haben Sie das sortiert? Ihre Komponenten entsprechen nicht den Best Practices. Sie sollten nur eine Binärdatei pro Komponente verwenden. Um Probleme zu vermeiden, empfehle ich eine Komponente pro Datei für kleine Projekte. Fügen Sie nur mehrere Dateien in eine Komponente ein, wenn Sie wissen, was Sie tun und/oder Ihr Setup sehr umfangreich ist. Aufgrund der Art des Windows-Installationsprogramms können Sie die Datei settings.xml nicht ordnungsgemäß beibehalten, bis Sie die Komponentenerstellung geändert haben. Sie müssten eine benutzerdefinierte Aktion schreiben, um die Einstellungsdatei früh in der Installationsreihenfolge zu sichern und sie nach der Installation wieder zu speichern. –

Antwort

0

Das erste, was Sie wahrscheinlich von diesem RemoveFolder in Ihrem CommonAppDataPathwaysFolderComponent Komponente tun müssen ist loszuwerden. Das wird dein Verzeichnis löschen und alles, was es enthält (einschließlich settings.xml). Fügen Sie den No-Over-Write wieder hinzu und sehen Sie, was passiert.

Welche Version von Wix verwenden Sie? 3 richtig?

+0

Ja, Version 3. – Joshua

0

Windows Installer installiert nur eine Komponente, wenn der Schlüsselpfad noch nicht vorhanden ist, oder zeigt auf eine Datei mit einer niedrigeren Version. Im typischen Fall einer Komponente mit einer einzigen Datei verwendet wix standardmäßig diese Datei als Schlüsselpfad. In diesem Fall ist der Schlüsselpfad der Komponente CommonAppDataPathwaysFolderComponent ein Registrierungsschlüssel. Es wurde explizit mit dem Attribut keypath=yes gekennzeichnet.

Sie planen die Deinstallation der alten Version nach der Installation der neuen Version. Wenn also der Schlüsselpfad für diese Komponente für die alte und die neue Version identisch ist, sollten die Dinge wie gewünscht funktionieren.

Die Tatsache, dass es nicht funktioniert, bedeutet, dass Sie den Schlüsselpfad der Komponente geändert haben. Anscheinend hat das alte Installationsprogramm keinen Wert für "Software \ TDR \ Pathways, Installed = 1" in die Registrierung geschrieben. Das neue Installationsprogramm sucht nach diesem Registrierungsschlüssel, findet ihn nicht und entscheidet, die Datei CommonAppDataPathwaysFolderComponent zu installieren und dabei die alte SETTINGS.XML-Datei zu überschreiben.

0

, wenn Ihr Code in einem Test ausgeführt habe ich diese Warnung

Warnung LGHT1076: ICE57: Komponente 'CommonAppDataPathwaysFolderComponent' sowohl pe r-Benutzer und pro-Maschine Daten mit einem HKCU Registry KeyPath.

und Der Fehler in der Protokolldatei während der Code ausgeführt wird, diese

C: \ Dokumente und Einstellungen \ All Users \ Application Data \ Pathways \ Settings.xml; Überschreiben; Wird nicht Patch; Datei existiert, ist unversionierte und unmodifizierten - Hash nicht Quelldatei

paßt die die XML-Dateikomponente (die XML-Datei) mit einem Pro-Benutzer-Registrierungsschlüssel Pfad pro Maschinendaten anzeigt.

die XML-Datei als Schlüsselpfad für die Komponente verwenden, wie so:

<Component Id="CommonAppDataPathwaysFolderComponent" Guid="087C6F14-E87E-4B57-A7FA-C03FC8488E0D"> 
    <CreateFolder> 
     <Permission User="Everyone" GenericAll="yes" /> 
    </CreateFolder> 

    <RemoveFolder Id="CommonAppDataPathways" On="uninstall" /> 
    <File Id="settingsXml" KeyPath="yes" ShortName="SETTINGS.XML" Name="Settings.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Settings\settings.xml" Vital="yes" /> 
</Component> 

Dies wird Windows Installer unversionierte Dateivergleich verwenden, wenn auch nicht entscheiden, diese Datei zu ersetzen.

Sie haben die Aktion RemoveExistingProducts nach der Aktion InstallFiles korrekt geplant, die sicherstellt, dass die neuen Versionen vor dem Entfernen der alten Versionen installiert werden.

+1

Dies zu versuchen löste den Lichtfehler, aber das Problem bleibt bestehen, die Einstellungsdatei wird ersetzt. Außerdem sind die MDF- und LDF-Dateien, die ich ersetzen muss, noch vorhanden. – Joshua

+0

Ich frage mich, ob das, weil die alte installierte Version von der neueren Version unterscheidet, hat es einen anderen Schlüsselpfad und muss daher neu installiert werden. Wenn das der Fall ist, dann können Sie nicht viel anderes tun als eine benutzerdefinierte Aktion, die die Datei an einen temporären Speicherort kopiert und dann zurück, sobald alles installiert wurde. –

+0

Bitte sehen Sie meinen Beitrag als Antwort in dieser Frage. Es ist nah! Es hat geholfen, die Einstellungen in eine eigene Komponente zu bringen, und jetzt besteht das Problem darin, dass die Datenbank ebenfalls erhalten bleibt und ersetzt werden muss! DANKE! – Joshua