2010-11-19 11 views
26

Usamos wix para crear nuestras configuraciones. Para la actualización, utilizamos las principales actualizaciones como se muestra en this answer by Rob Mensching. (En las versiones más nuevas de wix, puede usar el elemento MajorUpgrade). Normalmente, esto funciona bien. El producto anterior se elimina, luego se instala el nuevo producto.El instalador de Windows elimina el archivo versionado durante la actualización del producto, en lugar de degradarlo

Sin embargo, aparentemente lo anterior no es completamente equivalente a la desinstalación manual del producto anterior y la instalación manual del nuevo producto.

Consideremos por ejemplo el siguiente escenario:

  • versión 1.0 de nuestro producto se libera, que contiene la versión 5.0 de un DLL thirdparty
  • versión 1.1 de nuestro producto se libera, que contiene la versión 5.1 de la misma thirdparty dll
  • se lanza la versión 1.2 de nuestro producto, bajando de categoría a la versión 5.0 de la DLL de terceros porque descubrimos que la nueva versión presentaba más problemas de los que resolvía.

parecer con la lógica de actualización wix ligada arriba, la DLL 3rdparty desaparecerá al actualizar de liberación 01/01 a 01/02. Una reparación es necesaria para restaurarlo.

¿Hay alguna otra manera de actualizar, que funcionaría para este escenario? Creo que lo que estoy buscando es una lógica de actualización que permita la degradación de los componentes, comportándose exactamente como si uno desinstalara manualmente el producto anterior y luego instalara manualmente el nuevo producto.

Respuesta

4

Comportamientos como este generalmente tienen que ver con la secuencia de RemoveExistingProducts. Si ocurre lo suficientemente tarde, Windows Installer se habrá dado cuenta de que hay una versión más nueva de .dll en la máquina, por lo que la versión 1.2 no necesita instalarlo. Sin embargo, cuando RemoveExistingProducts da como resultado la eliminación de .dll, nada lo vuelve a poner.

Cosas que hacer, incluyendo cambiar la secuencia de RemoveExistingProducts, y mentir sobre la versión de .dll en tu paquete 1.2 (informa un número de versión más alto que el malo). La desventaja de esto último es un impacto pobre en las reparaciones o parches, ya que el .dll siempre parece estar desactualizado.

+0

La programación 'RemoveExistingProducts' después de' InstallFinalize' tiene otro efecto no deseado: el dll se mantiene en la versión más reciente. También consideré anular la versión del archivo en la configuración, pero esto tiene la desafortunada consecuencia de que tendré que actualizar manualmente ese número de versión falsa cada vez que cambie el DLL :-( –

+0

¿Por qué tendrías que seguir actualizándolo? ¿No estaba allí? solo una versión específica que no funciona, y está anulando eso para que la anterior se reinstale? Quizás mienta de que es exactamente la versión más nueva y configure REINSTALLMODE = emus. –

+0

El problema ya ocurre durante ** el cálculo de costos. ** En este punto, MSI ve que hay una versión más nueva y decide no instalar el nuevo archivo. Verá 'No permitir la instalación del componente: XXX ya que el mismo componente con el archivo de clave versionado más alto existe' en el registro. tendrías que programar RemoveExistingProducts ** antes de ** los costos. No veo cómo se podría hacer eso sin infringir ICE27 e ICE63. – Andreas

0

Intente programar RemoveExistingProducts antes, justo después de InstallValidate, y cambie el valor de REINSTALLMODE a amus. De esta forma, el producto anterior se eliminará por completo antes de que se copien los archivos del nuevo producto, y el modo a forzará la reinstalación de los archivos.

+4

Esta respuesta no es útil. La ubicación sugerida de 'RemoveExistingProducts' después de' InstallValidate' no ayuda. Establecer 'REINSTALLMODE' en' amus' es muy peligroso porque 'a' force reinstala TODOS los archivos, incluidos los archivos compartidos del sistema que puede * no desea * degradar. Por ejemplo, imagine que tiene algunos módulos de fusión que instalan DLL de tiempo de ejecución del sistema. Posteriormente, el proveedor revisa estos archivos DLL con un parche de seguridad. Cuando su paquete se instale más tarde con 'amus', sobrescribirá las DLL más nuevas y seguras del proveedor. –

+0

@JamesJohnston entonces, ¿qué harías? Asumiendo que * no * tiene módulos de fusión instalando DLLs en todo el sistema, 'amus' realmente parece ser la única solución factible que he podido encontrar. (Pero me encantaría saber de una solución mejor) – jalf

+2

@jalf: después de una búsqueda exhaustiva, llegué a la conclusión de que 'REINSTALLMODE = amus' es la única solución sensata. Sin embargo, solo se puede usar si no hay componentes compartidos en su instalación. – Andreas

0

No es óptimo, pero solucioné el mismo problema cambiando el nombre del dll de terceros y cambiando el GUID en el nodo componente asociado con él en el archivo .wxs.

6

También encontramos este problema donde las DLL de versiones más bajas no se volvían a instalar en una actualización importante. Pensé que era extraño que el instalador decidiera qué archivos instalar basándose en el control de versiones de los archivos existentes, entonces completamente desinstaló todo, pero aún así solo instaló qué archivos se había determinado instalar antes de desinstalar el producto anterior. Parece que podría ser un error en Windows Installer ...

Para solucionar este problema movimos la acción RemoveExistingProducts por encima de la acción CostFinalize.

Sé que el documentation on MSDN recomienda colocar el RemoveExistingProducts después InstallValidate, y no estoy seguro de si ponerlo antes de la acción InstallValidate tiene ningún efecto secundario negativo para mejoras de menor importancia, pero hemos decidido realizar sólo mejoras importantes para nuestros productos entonces esta solución parece funcionar para nosotros.

+1

¿Cómo te saliste con la tuya? Si trato de hacer esto en nuestro instalador, aparece este error: 'ICE27: 'RemoveExistingProducts' Action en la tabla InstallExecuteSequence en el lugar incorrecto. Current: Costing, Correct: Execution' – jalf

+0

Estamos usando InstallShield para construir nuestras instalaciones, y nos ha permitido poner las acciones en este orden. Quizás cualquier aplicación que esté utilizando para construir sus instaladores realiza algún tipo de verificación de verificación para un cierto orden y no permite esta secuencia. Si es así, puede que exista alguna forma de desactivar este control, pero no sé si sería recomendable. – ksun

+0

Una búsqueda rápida en Google me hizo saber que ICE significa Internal Consistency Evaluator, y esto debe estar ejecutándose durante la compilación de tu instalador. Para evitarlo, puede construir el instalador con la secuencia normal y luego abrir el MSI con una herramienta como Instedit y cambiar manualmente los valores de secuencia en la tabla InstallExecuteSequence. – ksun

Cuestiones relacionadas