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.
Leí en varios lugares de Internet acerca de una actualización importante, pero no pude hacer que funcione. ¿Alguien puede especificar los pasos exactos que debo seguir para agregar la función de desinstalación de la versión anterior a WiX?
fuente
<MajorUpgrade>
elemento " " debe colocarse después<Package>
. De lo contrario,candle
da el siguiente error: "error CNDL0107: La validación del esquema falló con el siguiente error en la línea 1, columna 473: El elemento 'Producto' en el espacio de nombres ' schemas.microsoft.com/wix/2006/wi ' tiene un elemento hijo no válido ' MajorUpgrade 'en el espacio de nombres' schemas.microsoft.com/wix/2006/wi '. Lista de posibles elementos esperados:' Paquete '. ".AllowDowngrades
oAllowSameVersionUpgrades
. Por defecto ya no.Finalmente encontré una solución: la estoy publicando aquí para otras personas que podrían tener el mismo problema (los 5):
Debajo del producto agregue lo siguiente:
En InstallExecuteSequence agregue:
A partir de ahora, cada vez que instalo el producto, elimina las versiones instaladas anteriores.
Nota: reemplace el Id. De actualización con su propio GUID
fuente
ProductVersion
solo admite tres campos de versión; por lo tanto, el cuarto campo no se comparará en absoluto. Consulte la nota en VersionMin y VersionMax en msdn.microsoft.com/en-us/library/aa372379(VS.85).aspxEl siguiente es el tipo de sintaxis que uso para las actualizaciones principales:
Como señaló @Brian Gillespie, hay otros lugares para programar RemoveExistingProducts según las optimizaciones deseadas. Tenga en cuenta que PUT-GUID-AQUÍ debe ser idéntico.
fuente
<InstallExecute After="RemoveExistingProducts" />
. Su ejemplo no tiene esto, ¿eso significa que el libro está equivocado?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.
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 está el campo Máximo. Cuando creamos instaladores, establecemos UpgradeVersion Maximum en 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):
Esto deja instalada la versión anterior del producto hasta después de que se copian los nuevos archivos y 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 cortés y migrar su configuración). 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 completamente la versión anterior y luego se instala la nueva versión. Esto da como resultado 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
fuente
RemoveExistingProducts
estaba programado para despuésInstallFinalize
y los dlls no se actualizaban porque la versión de ensamblaje no se modificó, pero sí otros campos como AssemblyProduct. No quiero estar a merced de la rutina de comparación de archivos, solo quiero que la aplicación anterior se haya idoTal vez sea mejor preguntar 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. Puede considerar obtener " La guía definitiva para el instalador de Windows ".
La acción que elimina un producto existente es la acción RemoveExistingProducts . Debido a que las consecuencias de lo que hace depende de dónde está programado, es decir, si una falla hace que el producto antiguo se reinstale y si los archivos no modificados se copian nuevamente, debe programarlo usted mismo.
RemoveExistingProducts
procesa<Upgrade>
elementos en la instalación actual, haciendo coincidir el@Id
atributo con elUpgradeCode
(especificado en el<Product>
elemento) de todos los productos instalados en el sistema. ElUpgradeCode
define una familia de productos relacionados. Se eliminarán todos los productos que tengan este UpgradeCode, cuyas versiones se encuentren dentro del rango especificado, y donde elUpgradeVersion/@OnlyDetect
atributo esténo
(o se omita).La documentación para las
RemoveExistingProducts
menciones que establecen laUPGRADINGPRODUCTCODE
propiedad. Significa que el proceso de desinstalación del producto que se elimina recibe esa propiedad, cuyo valor es elProduct/@Id
del producto que se está instalando.Si su instalación original no incluía un
UpgradeCode
, no podrá utilizar esta función.fuente
Usé este sitio para ayudarme a comprender los conceptos básicos sobre la actualización de WiX:
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
Luego creé un instalador de muestra (instalé un archivo de prueba), luego creé el instalador de actualización (instalé 2 archivos de prueba de muestra). Esto le dará una comprensión básica de cómo funciona el mecanismo.
Y como Mike dijo en el libro de Apress, "La guía definitiva para el instalador de Windows", le ayudará a comprender, pero no está escrito con WiX.
Otro sitio que fue bastante útil fue este:
http://www.wixwiki.com/index.php?title=Main_Page
fuente
Leí la documentación de WiX , descargué ejemplos, pero aún tuve muchos problemas con las actualizaciones. Las actualizaciones menores no ejecutan la desinstalación de los productos anteriores a pesar de la posibilidad de especificar esas desinstalaciones. Pasé más de un día en investigaciones y descubrí que WiX 3.5 introdujo una nueva etiqueta para las actualizaciones. Aquí está el uso:
Pero la razón principal de los problemas fue que la documentación dice que se deben usar los parámetros " REINSTALL = ALL REINSTALLMODE = vomus " para actualizaciones menores y pequeñas, pero no dice que esos parámetros estén PROHIBIDOS para actualizaciones importantes , simplemente dejan de funcionar. Por lo tanto, no debe usarlos con actualizaciones importantes.
fuente
Sugeriría echar un vistazo al tutorial de Alex Shevchuk. Explica "actualización importante" a través de WiX con un buen ejemplo práctico en From MSI to WiX, Parte 8 - Actualización importante .
fuente
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 los errores "Otra versión de este producto ya está instalada":
* Pequeñas actualizaciones significan pequeños cambios en uno o unos pocos archivos donde el cambio no garantiza cambiar la versión del producto (major.minor.build). Tampoco tiene 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á. Modifique el atributo Versión de la etiqueta Producto. El producto seguirá siendo el mismo, por lo que no necesita cambiar el GUID del producto sino, por supuesto, obtener un nuevo GUID del paquete.
Las actualizaciones importantes denotan cambios significativos, como pasar de una versión completa a otra. Cambie todo: atributo de versión, GUID de producto y paquete.
fuente
Estoy usando la última versión de WiX (3.0) y no pude hacer funcionar lo anterior. Pero esto funcionó:
Tenga en cuenta que PUT-GUID-AQUÍ debe ser el mismo que el GUID que ha definido en la propiedad UpgradeCode del Producto.
fuente
A continuación funcionó para mí.
Asegúrese de que el Código de actualización en el producto coincida con el ID en la actualización.
fuente
Esto es lo que funcionó para mí, incluso con un grado DOWN importante :
fuente