metaetiqueta - wix head tag
WiX: tratando de descubrir las secuencias de instalación (4)
Intente obtener un archivo de registro de la instalación y busque el orden de las secuencias y el valor de la condición para realizar la acción personalizada.
Use esto en la línea de comando: msiexec / i [msiname] / l * v [nombre de archivo]
EDITAR: Después de leer su comentario eche un vistazo a esta página, aquí podría tratar de agregar NO INSTALADO en la condición
EDIT2: Encontré esta página Buscar su error Número 1631
Estoy instalando una aplicación grande, y parte de ella es una herramienta escrita personalizada llamada "DbUpdateManager" para ejecutar en masa las secuencias de comandos SQL en nuestra base de datos de destino.
En este momento, la instalación de WiX 2.x funciona, pero tiene un inconveniente: durante la instalación, también instalé un par de servicios de Windows, que se pueden iniciar de forma opcional de inmediato. Sin embargo, aquellos fallarán si el DbUpdateManager aún no se ha ejecutado.
Entonces, lo que estoy tratando de lograr es esto:
- Instalar DbUpdateManager y mis servicios desde mi MSI
- Ejecute DbUpdateManager ANTES de que se inicie alguno de los servicios
Mi fuente actual de WiX se ve así:
<Directory Id=''INSTALLDIR'' Name=''DbUpdMgr'' LongName=''DbUpdateManager'' >
<!-- DbUpdateManager component with the necessary files -->
<Component Id=''DbUpdateManagerComponent'' Guid=''...'' DiskId=''1''>
<File Id=''DbUpdateManagerFile'' LongName=''DbUpdateManager.Wizard.exe''
Name=''DbUmWz.exe'' src=''DbUpdateManager.Wizard.exe'' KeyPath=''no'' />
</Component>
<!-- Component to install one of my Windows services -->
<Component Id=''InstallServiceComponent'' Guid=''...'' DiskId=''1''>
<File Id=''InstallServiceFile'' LongName=''MyService.exe''
Name=''MyServic.exe'' src=''MyService.exe'' KeyPath=''yes''/>
<ServiceInstall Id=''InstallMyService'' Name=''MyService''
Description=''My Service'' ErrorControl=''normal''
Start=''auto'' Type=''ownProcess'' Vital=''yes'' />
<ServiceControl Id=''UninstallMyService'' Name=''MyService''
Remove=''uninstall'' Wait=''yes'' />
</Component>
<!-- Feature for the DbUpdateManager referencing the above component -->
<Feature Id=''DbUpdateManager'' ConfigurableDirectory=''INSTALLDIR''
AllowAdvertise=''no'' Description=''DbUpdateManager'' Level=''1''
Title=''Database Update Manager''>
<ComponentRef Id=''DbUpdateManagerComponent''/>
</Feature>
<!-- Custom action for running DbUpdateManager -->
<CustomAction Id=''RunDbUpdateManagerAction'' FileKey=''DbUpdateManagerFile''
ExeCommand='''' Return=''asyncWait'' />
<!-- Calling the custom action in the install sequence -->
<InstallExecuteSequence>
<RemoveExistingProducts After=''InstallInitialize'' />
<Custom Action=''RunDbUpdateManagerAction''
After=''InstallFinalize''>&DbUpdateManager=3</Custom>
Heredé este WIX, y funciona, pero como dije, el DbUpdateManager se llama demasiado tarde en el proceso (solo "After = InstallFinalize") y, por lo tanto, los servicios no se iniciarán correctamente al principio (la ejecución es correcta por segunda vez) alrededor cuando los reinicia manualmente después de ejecutar DbUpdateManager).
Busqué un poco la documentación de MSI y encontré un buen paso llamado "StartServices", por lo que mi corazonada fue simplemente cambiar mi llamada a la acción personalizada para esto:
<InstallExecuteSequence>
<Custom Action=''RunDbUpdateManagerAction''
Before=''StartServices''>&DbUpdateManager=3</Custom>
Desafortunadamente, en este caso, no pasa nada: se llama a DbUpdateManager NUNCA ...
¿Alguna idea de por qué? Depurar las cosas de MSI / WiX es realmente muy complicado, y parece que ya no puedo ver el bosque por los árboles ...
¡Gracias! Bagazo
EDITAR: El "RunDbUpdateManagerAction" se coloca en la posición correcta en la tabla InstallExecuteSequence en mi MSI - justo después de InstallServices y justo ANTES de StartServices - y aún así no funciona ... DbUpdateManager (una utilidad Winforms) no se muestra durante instalación :-(
EDIT 2: ahora mi acción parece ejecutarse y en el momento adecuado - desafortunadamente, simplemente no estoy viendo mi asistente :-( Lo que estoy viendo es un código de error "return value 1631" que significa algo así como "Servicio MSI" no se pudo iniciar "- wtf ???
MSI (s) (2C: D8) [20: 53: 36: 383]: Acción: RunDbUpdateManagerAction Acción 20:53:36: RunDbUpdateManagerAction. La acción comenzó a las 20:53:36: RunDbUpdateManagerAction. MSI (s) (2C: D8) [20: 53: 36: 383]: Acción: Iniciar Servicios Acción 20:53:36: Iniciar Servicios. Los servicios se están iniciando. La acción comenzó a las 20:53:36: StartServices. Acción finalizada a las 20:53:36: RunDbUpdateManagerAction. Valor de retorno 1631.
Puede abrir .msi en Orca y ver la tabla InstallExecuteSequence para ver en qué orden están sucediendo realmente las cosas. Esto puede darle una buena idea de lo que está sucediendo en realidad.
Bueno, finalmente funcionó, con un poco de ayuda de todos los que respondieron, y consultando algunos de los tutoriales y páginas de ayuda de WiX disponibles en la web. Las cosas del instalador de MSI no son fáciles de descubrir y aprender ...
Básicamente, cambié la ejecución de mi acción personalizada a "diferido" (como lo sugirió Rob) y moví el punto en la secuencia donde se ejecuta a "After = InstallFiles". También cambié la condición en la etiqueta <Custom> a "NO instalado", que parece funcionar bien en mi escenario.
Contrariamente al temor de Rob, el Administrador de actualizaciones de Db y su interfaz de usuario vienen bastante bien de esta manera, y el proceso de actualización de nuestra base de datos se ha completado antes de que cualquiera de nuestros servicios (que dependen de la base de datos) comience.
¡Esperando un lanzamiento completo de RTM de WiX 3.0 (y su futuro)!
Gracias a todos, desafortunadamente, solo pude aceptar una respuesta, todos me lo merecían.
Bagazo
Parece que su CustomAction depende del ''DbUpdateManagerFile'' que se está instalando. Eso significa que su CustomAction necesita ser programada después de que InstallFiles se ejecute. Recuerde que hay dos pases para InstallExecuteSequence. Primero, las acciones "inmediatas" (o "programadas" o "generación de scripts") se ejecutan para construir el registro de transacciones (también conocido como "script de instalación"). En segundo lugar, se ejecutan las acciones "diferidas" en el registro de transacciones.
En este momento, su CustomAction es "inmediata" (el valor predeterminado) por lo que está intentando ejecutar antes de que los archivos se copien realmente en la máquina. La acción InstallFiles está en la secuencia de comandos antes de su CustomAction pero aún no se ha ejecutado.
Por lo tanto, debe marcar su acción personalizada "diferida" para que se ejecute después de que se instalen sus archivos.
Nota: probablemente no podrá mostrar la IU de una CA diferida. No estaba seguro de si se esperaba que esta herramienta tuya mostrara UI.
PD: lo siento si no lo he explicado bien, ha sido un día largo.