2010-05-11 12 views
6

Tenemos un instalador de producto creado con Wix, que contiene un paquete de programa ("V1") y algunos archivos de configuración. Ahora, vamos a hacer una actualización importante con un nuevo código de producto, donde se desinstala la versión anterior del producto y se instala "V2". Lo que queremos es guardar uno de los archivos de configuración de la desinstalación, ya que también es necesario para el V2. Lamentablemente, olvidamos configurar la opción Permanent="yes" cuando entregamos V1 (read this question para obtener más información).WiX, cómo evitar que los archivos se desinstalen aunque olvidamos establecer Permanent = "yes"

Aquí viene la pregunta: ¿hay alguna manera fácil de evitar la desinstalación del archivo de todos modos? Por supuesto, podríamos agregar una acción personalizada al script para hacer una copia de seguridad del archivo antes de la desinstalación, y otra acción personalizada para restaurarlo después, pero en mi humilde opinión parece ser excesivo para esta tarea y podría interferir con otras partes del proceso de registro de MSI. .

EDITAR: Y sí, el atributo NeverOverwrite="yes" ya está configurado en V2, y el comportamiento es como lo describí.

No creo que ayude cambiar algo directamente en los parámetros de los componentes de V2. Quizás hay una posibilidad de modificar el registro de alguna manera en una acción personalizada antes de desinstalar V1, por lo que el servicio de instalación cree que el archivo de configuración en V1 se instaló con Permanent="yes"?

+0

¿No puede simplemente reinstalar esos archivos, o es que desea conservar el archivo local porque pueden haber sido modificados? –

+0

Ese es exactamente el caso: el archivo de configuración puede haberse modificado y se debe mantener tal como está. –

Respuesta

5

Prueba el atributo NeverOverwrite para el archivo de configuración

Si este atributo se establece en 'sí', la instalador no instala ni vuelva a instalar el componente si una clave de archivo de ruta o una clave de registro ruta entrada para el componente ya existe.

EDITAR

Acabo probado esto en una configuración de prueba. Al principio no funcionó porque había programado la acción RemoveExistingProducts antes de la secuencia InstallInitialize. Esto elimina el producto anterior antes de que se instale el nuevo producto, por lo que no se puede comparar.

Sin embargo, cuando lo configuré después de InstallFinalize funcionó, dejó el archivo allí aunque la configuración original no tenía NeverOverwrite establecido. aquí están mis dos ejemplos de prueba

versión 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> 

versión 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

Puede que no funcione si tiene RemoveExistingProducts en el orden incorrecto –

+0

No, eso tampoco parece funcionar (ya teníamos ) en V1 y V2. ¿Estás seguro de que usaste un entorno limpio para tus pruebas, es decir, una máquina virtual? –

+0

Estoy usando la versión 3.5, ¿qué versión estás usando? No debería hacer la diferencia, ¡pero podría ser! Además, si compila ambos ejemplos, instale el primero y luego el segundo, el archivo no será reemplazado. ¿Alguno de estos archivos está siendo reemplazado en un componente por usuario? –

0

La forma en que estoy arreglando esto es muy simple. No instalo los archivos yourapp.config, sino solo yourapp.config.new Al ejecutar por primera vez la aplicación antes de hacer cualquier otra cosa, compruebe el archivo de configuración. Si no hay ninguna, haga una copia de yourapp.config.new a yourapp.config

Esto es muy simple, no utiliza ningún atributo especial. Cuando la aplicación se desinstala, el archivo de configuración no se desinstala. Cuando se vuelve a instalar la aplicación, el archivo se altera. Tenga en cuenta que cuando se repara la aplicación, la configuración tampoco se modifica.

+0

Bueno, tu respuesta pierde dos puntos de la pregunta. Primero, la pregunta es sobre un sistema ya implementado. Permitir que el instalador elimine el archivo de configuración (incluso cuando la aplicación V2.0 podría crear uno nuevo) descarta cualquier información que un administrador haya ingresado manualmente allí, que es lo que quería evitar. En segundo lugar, estaba hablando de un archivo de configuración que vive en el directorio 'Program', donde en la mayoría de los entornos empresariales necesita derechos de acceso administrativo para escribir allí cualquier cosa, que el instalador tenga, pero no un programa" normal ". –

Cuestiones relacionadas