installer - metaetiqueta - wix head tag




¿Cómo implementar la actualización del instalador de WiX? (8)

En el trabajo usamos WiX para construir paquetes de instalación. Queremos que la instalación del producto X resulte en la desinstalación de la versión anterior de ese producto en esa máquina.

He leído en varios sitios de Internet una actualización importante, pero no pude hacer que funcionara. ¿Alguien puede especificar los pasos exactos que debo seguir para agregar la función de desinstalación de la versión anterior a WiX?


A continuación funcionó para mí.

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

Asegúrese de que el código de actualización en el producto coincida con la identificación en la actualización.


El elemento Actualizar dentro del elemento Producto, combinado con la programación adecuada de la acción, realizará la desinstalación que está buscando. Asegúrese de enumerar los códigos de actualización de todos los productos que desea eliminar.

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

Tenga en cuenta que, si tiene cuidado con sus compilaciones, puede evitar que las personas instalen accidentalmente una versión anterior de su producto sobre una nueva. Para eso es el campo Máximo. Cuando construimos instaladores, configuramos UpgradeVersion Maximum a la versión que se está construyendo, pero IncludeMaximum = "no" para evitar este escenario.

Tiene opciones con respecto a la programación de RemoveExistingProducts. Prefiero programarlo después de InstallFinalize (en lugar de después de InstallInitialize como otros lo han recomendado):

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

Esto deja instalada la versión anterior del producto hasta que se copian los nuevos archivos y las claves de registro. Esto me permite migrar datos de la versión anterior a la nueva (por ejemplo, ha cambiado el almacenamiento de las preferencias del usuario del registro a un archivo XML, pero desea ser educado y migrar sus configuraciones). Esta migración se realiza en una acción personalizada diferida justo antes de InstallFinalize.

Otro beneficio es la eficiencia: si hay archivos sin cambios, Windows Installer no se molesta en copiarlos nuevamente cuando programa después de InstallFinalize. Si programa después de InstallInitialize, primero se elimina por completo la versión anterior y luego se instala la nueva versión. Esto resulta en la eliminación innecesaria y la copia de archivos.

Para otras opciones de programación, vea el tema de ayuda RemoveExistingProducts en MSDN. Esta semana, el enlace es: http://msdn.microsoft.com/en-us/library/aa371197.aspx


En las versiones más nuevas (de la versión beta 3.5.1315.0), puede usar el elemento MajorUpgrade en lugar de usar el suyo.

Por ejemplo, usamos este código para hacer actualizaciones automáticas. Evita las degradaciones, da un mensaje de error localizado y también evita la actualización de una versión idéntica ya existente (es decir, solo se actualizan las versiones inferiores):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

Esto es lo que funcionó para mí, incluso con el mayor grado de ABAJO :

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />

Finalmente encontré una solución: la estoy publicando aquí para otras personas que podrían tener el mismo problema (los 5):

  • Cambie la ID del producto a *
  • En el producto, agregue lo siguiente:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
    
  • Bajo InstallExecuteSequence agregue:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

De ahora en adelante, siempre que instale el producto, se eliminaron las versiones instaladas anteriores.

Nota: reemplace el ID de actualización con su propio GUID


Leí la documentación de WiX , ejemplos descargados, pero todavía tenía muchos problemas con las actualizaciones. Las actualizaciones menores no ejecutan la desinstalación de los productos anteriores a pesar de la posibilidad de especificarlos. Gasté más de un día para las investigaciones y descubrí que WiX 3.5 introdujo una nueva etiqueta para las actualizaciones. Aquí está el uso:

<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." AllowDowngrades="no" />

Pero la principal razón de los problemas fue que la documentación dice que se deben usar los parámetros " REINSTALL = ALL REINSTALLMODE = vomus " para las actualizaciones menores y pequeñas, pero no dice que esos parámetros estén PROHIBIDOS para las actualizaciones principales , simplemente dejan de funcionar. Así que no deberías usarlos con actualizaciones importantes.


Tal vez sea mejor que preguntes esto en la lista de correo de usuarios de WiX .

WiX se utiliza mejor con una comprensión firme de lo que está haciendo Windows Installer. Podría considerar obtener la " Guía definitiva para Windows Installer ".

La acción que elimina un producto existente es la http://msdn.microsoft.com/en-us/library/aa371197.aspx . Debido a que las consecuencias de lo que hace dependen de dónde está programado, es decir, si una falla causa la reinstalación del producto anterior y si los archivos que no se modifican se vuelven a copiar, debe programarlo usted mismo.

RemoveExistingProducts procesa los elementos <Upgrade> en la instalación actual, haciendo coincidir el atributo @Id con el UpgradeCode (especificado en el elemento <Product> ) de todos los productos instalados en el sistema. El UpgradeCode define una familia de productos relacionados. Cualquier producto que tenga este UpgradeCode, cuyas versiones se encuentren dentro del rango especificado, y donde el UpgradeVersion/@OnlyDetect sea no (o se omita), se eliminará.

La documentación para RemoveExistingProducts menciona la configuración de la propiedad UPGRADINGPRODUCTCODE . Significa que el proceso de desinstalación del producto que se está eliminando recibe esa propiedad, cuyo valor es Product/@Id para el producto que se está instalando.

Si su instalación original no incluía un UpgradeCode , no podrá usar esta función.


Una cosa importante que me perdí de los tutoriales por un tiempo (robada de http://www.tramontana.co.hu/wix/lesson4.php ) que resultó en los errores "Ya está instalada otra versión de este producto":

* Las pequeñas actualizaciones significan pequeños cambios en uno o varios archivos donde el cambio no justifica cambiar la versión del producto (major.minor.build). Tampoco tienes que cambiar el GUID del producto. Tenga en cuenta que siempre debe cambiar el GUID del paquete cuando cree un nuevo archivo .msi que sea diferente de los anteriores en cualquier aspecto. El instalador realiza un seguimiento de sus programas instalados y los encuentra cuando el usuario desea cambiar o eliminar la instalación utilizando estos GUID. Usar el mismo GUID para diferentes paquetes confundirá al instalador.

Las actualizaciones menores indican cambios en los que la versión del producto ya cambiará. Modificar el atributo de versión de la etiqueta del producto. El producto seguirá siendo el mismo, por lo que no necesita cambiar el GUID del producto, pero, por supuesto, obtener un nuevo GUID del paquete.

Las actualizaciones principales indican cambios significativos, como pasar de una versión completa a otra. Cambiar todo: atributo de versión, producto y paquete GUIDs.