2010-05-04 4 views
5

ARGH! Wix me está volviendo loco.¡Atascado en la preservación del archivo de configuración en WIX major upgrade!

Así que, por supuesto, he visto muchas publicaciones aquí en stackoverflow y en otras partes sobre WiX y actualizaciones importantes. Heredé este proyecto de software usando WiX y estoy lanzando una nueva versión. Necesito esta nueva versión para dejar SOLO el archivo de configuración si está presente y reemplazar todo lo demás. Este instalador funciona EXCEPTO sin importar lo que he hecho hasta ahora, el nuevo archivo XML reemplaza al viejo en cada instalación. ¡Incluso tratando de usar NeverOverwrite = "yes" e incluso probando y jugando con OnlyDetect = "no"! Simplemente estoy atrapado y humildemente solicito un poco de orientación. El archivo que debe conservarse se llama SETTINGS.XML y está en el directorio All Users-> ApplicationData. ¡Aquí está (la mayoría de) mi archivo .wxs!

<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

¿Has ordenado esto? Sus componentes no están en línea con las mejores prácticas. Debe usar solo un binario por componente. Para evitar problemas, recomiendo un componente por archivo para proyectos pequeños. Solo coloque varios archivos en un componente si sabe lo que está haciendo y/o su configuración es enorme. Debido a la naturaleza del instalador de Windows, no podrá conservar adecuadamente el archivo settings.xml automáticamente hasta que haya cambiado la creación del componente. Tendrá que escribir una acción personalizada para hacer una copia de seguridad del archivo de configuración temprano en la secuencia de instalación y luego volver a colocarlo en su lugar después de la instalación. –

Respuesta

0

Lo primero que probablemente tendrá que hacer es deshacerse de ese RemoveFolder en su componente CommonAppDataPathwaysFolderComponent. Eso va a borrar tu directorio y todo lo que contiene (incluyendo settings.xml). Agregue el neveroverwrite nuevamente y vea qué sucede.

¿Qué versión de wix estás utilizando? 3 ¿verdad?

+0

Sí, versión 3. – Joshua

0

El instalador de Windows solo instala un componente si keypath aún no está presente o apunta a un archivo con una versión inferior. En el caso típico de un componente de un solo archivo, wix utiliza de manera predeterminada ese archivo como keypath. En este caso, el keypath del componente CommonAppDataPathwaysFolderComponent es una clave de registro; se ha marcado explícitamente con el atributo keypath=yes.

Programe la desinstalación de la versión anterior después de la instalación de la nueva versión. Entonces, si el keypath de este componente es el mismo para la versión antigua y la nueva, entonces las cosas deberían funcionar como lo desee.

El hecho de que no funcione implica que ha cambiado la ruta de teclas del componente. Aparentemente, el instalador anterior no escribió un valor "Software \ TDR \ Pathways, Installed = 1" en el registro. El nuevo instalador busca esta clave de registro, no la encuentra y decide instalar el CommonAppDataPathwaysFolderComponent, sobrescribiendo el antiguo archivo SETTINGS.XML en el proceso.

0

cuando se ejecuta el código en una prueba que tiene esta advertencia

LGHT1076 advertencia: ICE57: Componente 'CommonAppDataPathwaysFolderComponent' tiene tanto pe r por el usuario y por equipo datos con un HKCU Registro KeyPath.

y El error en el archivo de registro mientras se ejecuta el código es este

C: \ Documents and Settings \ Todos los usuarios \ Application Data \ Caminos \ Settings.xml; Exagerar; No se aplicará el parche ; archivo existente es versionado y sin modificar - hash no coincide archivo de origen

que indica el componente de archivo XML tiene por datos de la máquina (el archivo XML) con un camino de claves por registro de usuarios.

utilizar el archivo XML como una ruta de acceso clave para el componente de esta manera:

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

Esto hará que Windows Installer utiliza la comparación del archivo no versionado la hora de decidir si o no para reemplazar este archivo.

ha programado correctamente la acción RemoveExistingProducts después de la acción InstallFiles que asegura que las nuevas versiones estén instaladas antes de eliminar las versiones anteriores.

+1

Al intentar esto se eliminó el error de la luz, pero aún así el problema persiste, se reemplaza el archivo de configuración. Y también, los archivos MDF y LDF que necesito que sean reemplazados permanecen. – Joshua

+0

Me pregunto si eso se debe a que el componente de versión instalada anterior es diferente del más nuevo, tiene una ruta clave diferente y por lo tanto necesita reinstalación. Si ese es el caso, no hay mucho que pueda hacer aparte de una acción personalizada que copie el archivo en una ubicación temporal y luego vuelva una vez que todo haya sido instalado. –

+0

Por favor vea mi publicación como una respuesta en esta pregunta. ¡Está cerca! Se ayudó a poner la configuración en su propio componente, y ahora el problema es que la base de datos se está conservando también, ¡y eso necesita ser reemplazado! ¡GRACIAS! – Joshua

Cuestiones relacionadas