Pregunta

En el trabajo usamos WiX para la creación de paquetes de instalación.Queremos que la instalación del producto X, el resultado sería en la desinstalación de la versión anterior de ese producto en esa máquina.

He leído en varios lugares en el Internet acerca de una actualización importante, pero no podía llegar a trabajar.Puede alguien por favor especificar exactamente los pasos que debo tomar para agregar desinstalar la versión anterior de la característica de WiX?

¿Fue útil?

Solución

En las versiones más recientes (a partir de la 3.5.1315.0 beta), puede utilizar la MajorUpgrade elemento en lugar de utilizar su propio.

Por ejemplo, podemos utilizar este código para hacer las actualizaciones automáticas.Evita que se degrade, dando un localizada mensaje de error, y también impide la actualización de la ya existente versión idéntica (es decir,sólo inferior actualizar las versiones):

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

Otros consejos

Finalmente he encontrado una solución - voy a postear aquí para que otras personas que puedan tener el mismo problema (todos los 5 de usted):

  • Cambiar el ID de producto a *
  • En virtud de producto agregue El 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 agregar:

    <RemoveExistingProducts Before="InstallInitialize" /> 
    

A partir de ahora siempre que puedo instalar el producto se retira anteriores versiones instaladas.

Nota: reemplazar la actualización de Identificación con su propio GUID

El siguiente es el tipo de sintaxis que uso para actualizaciones importantes:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

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

Como @Brian Gillespie, comentó que hay otros lugares para programar el RemoveExistingProducts dependiendo deseado optimizaciones.Nota la PUSO-GUID-AQUÍ deben ser idénticos.

La Actualización del elemento en el interior del Producto elemento, combinado con una adecuada programación de la acción que llevará a cabo la desinstalación de que usted está después.Asegúrese de incluir la actualización de los códigos de todos los productos que desea quitar.

<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 usted es cuidadoso con la construye, usted puede impedir que la gente accidentalmente la instalación de una versión anterior de su producto a través de una más reciente.Eso es lo que el Máximo es de campo para.Cuando construimos los instaladores, se establece UpgradeVersion Máximo para la versión que se construyó, pero IncludeMaximum="no" para evitar este escenario.

Usted tiene opciones en relación a la programación de RemoveExistingProducts.Yo prefiero la programación de la misma después de InstallFinalize (en lugar de después de InstallInitialize como otros lo han recomendado):

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

Esto deja a la versión anterior del producto instalado hasta después de las nuevas claves de registro y archivos se copian.Esto me permite migrar los datos de la versión antigua a la nueva (por ejemplo, de que haya cambiado de almacenamiento de preferencias de usuario desde el registro a un archivo XML, pero usted quiere ser amable y migrar sus ajustes).Esta migración se realiza de forma diferida acción personalizada justo antes de InstallFinalize.

Otra ventaja es la eficiencia:si no se modifican los archivos de Windows Installer, no se molesta a copiarlos de nuevo a la hora de programar después de InstallFinalize.Si programa después de InstallInitialize, la versión anterior se elimina completamente en primer lugar, y luego se instala la versión nueva.Esto se traduce en innecesaria la eliminación y copiar archivos.

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

Sería mejor preguntar esto en el WiX-los usuarios de la lista de correo.

WiX es la mejor opción con un firme entendimiento de lo que Windows Installer está haciendo.Usted podría considerar la posibilidad de llegar "La Guía Definitiva de Windows Installer".

La acción que elimina un producto existente es el Acción RemoveExistingProducts.Porque las consecuencias de lo que hace depende de donde programada - es decir, si un fallo hace que el producto de edad para ser reinstalado, y si los ficheros no se copian de nuevo - tienes que programar tu mismo.

RemoveExistingProducts los procesos de <Upgrade> los elementos de la instalación actual, la coincidencia de la @Id el atributo de la UpgradeCode (especificado en el <Product> elemento) de todos los productos instalados en el sistema.El UpgradeCode define una familia de productos relacionados.Cualquiera de los productos que tienen esta UpgradeCode, cuyas versiones caen en el rango especificado, y donde la UpgradeVersion/@OnlyDetect atributo es no (o se omite), será eliminado.

La documentación para RemoveExistingProducts menciona la configuración de la UPGRADINGPRODUCTCODE de la propiedad.Esto significa que el proceso de desinstalación para que el producto se retira recibe la propiedad, cuyo valor es el Product/@Id para el producto que está siendo instalado.

Si su instalación original no incluía un UpgradeCode, usted no será capaz de utilizar esta función.

He utilizado este sitio para que me ayude a entender los conceptos básicos acerca de WiX Actualización:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

Después he creado un Instalador de ejemplos, (se instala un archivo de prueba), luego se crea el instalador de Actualización (instalado 2 de la prueba de muestra de archivos).Esto le dará una comprensión básica de cómo funciona el mecanismo.

Y como dijo Mike en el libro de Apress, "La Guía Definitiva de Windows Installer", que le ayudará a entender, pero no está escrito usando WiX.

Otro sitio que era bastante útil fue esta:

http://www.wixwiki.com/index.php?title=Main_Page

He leído el WiX documentación, descargar ejemplos, pero yo todavía tenía un montón de problemas con las actualizaciones.Mejoras de menor importancia no ejecutar la desinstalación de los productos anteriores, a pesar de la posibilidad de especificar esos desinstalar.Pasé más que un día para investigaciones y encontró que WiX 3.5 intoduced una nueva etiqueta para las actualizaciones.Aquí es el uso de:

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

Pero el razón principal de los problemas era que la documentación dice que el uso de la "REINSTALL=ALL REINSTALLMODE=vomus"los parámetros para los pequeños y pequeñas mejoras, pero no dice que esos parámetros son PROHIBIDO para la mayoría de las actualizaciones - simplemente dejan de funcionar.Así que usted no debe usar con mejoras importantes.

Sugiero echar un vistazo a Alex Shevchuk del tutorial.Él explica: "actualización importante" a través de WiX con un buen ejemplo práctico en A partir de MSI a WiX, Parte 8 - Actualización Principal.

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

*Pequeñas actualizaciones la media de pequeños cambios a uno o unos archivos donde el cambio no garantiza el cambio de la versión del producto (de mayor.menor de edad.construir).Usted no tiene que cambiar el GUID del Producto, ya sea.Tenga en cuenta que siempre tiene que cambiar el GUID del Paquete cuando se crea una nueva .archivo msi que es diferente de las anteriores en cualquier sentido.El Instalador realiza un seguimiento de tus programas instalados y la encuentra cuando el usuario quiere cambiar o quitar la instalación el uso de estos Guid.Utilizando el mismo GUID de diferentes paquetes se debe confundir el Instalador.

Mejoras de menor importancia indicar los cambios donde la versión del producto ya va a cambiar.Modificar el atributo de Versión de la etiqueta del Producto.El producto seguirá siendo el mismo, así que usted no necesita cambiar el GUID del Producto pero, por supuesto, conseguir un nuevo Paquete de GUID.

Mejoras importantes denotar cambios significativos como pasar de una versión completa a otro.Cambiar todo:Atributo de versión, el Producto y el Paquete de Guid.

Estoy usando la última versión de WiX (3.0) y no podía conseguir trabajo.Pero este trabajo:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

Tenga en cuenta que PUT-GUID-AQUÍ debe ser el mismo que el GUID que se han definido en el UpgradeCode la propiedad del Producto.

A continuación trabajó 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>

Por favor, asegúrese de que el UpgradeCode en Producto es la coincidencia de Id en la Actualización.

Esto es lo que ha funcionado para mí, incluso con los principales ABAJO grado:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top