Hemos estado usando WiX por un tiempo, y a pesar de las quejas habituales sobre la facilidad de uso, está funcionando razonablemente bien. Lo que estoy buscando son consejos útiles con respecto a:
- Configuración de un proyecto WiX (diseño, referencias, patrones de archivos)
- Integrando WiX en soluciones y procesos de construcción / lanzamiento
- Configurar instaladores para nuevas instalaciones y actualizaciones
- Cualquier buen truco de WiX que quieras compartir
practical, answerable questions based on actual problems that you face
parte de las preguntas frecuentes.Respuestas:
Mantenga las variables en un
wxi
archivo de inclusión separado . Permite la reutilización, las variables son más rápidas de encontrar y (si es necesario) permite una manipulación más fácil por una herramienta externa.Definir variables de plataforma para compilaciones x86 y x64
Almacene la ubicación de instalación en el registro, permitiendo actualizaciones para encontrar la ubicación correcta. Por ejemplo, si un usuario establece un directorio de instalación personalizado.
Nota : el gurú de WiX Rob Mensching ha publicado una excelente entrada de blog que entra en más detalles y corrige un caso extremo cuando las propiedades se configuran desde la línea de comandos.
Ejemplos usando 1. 2. y 3.
y
El enfoque más simple es siempre realizar actualizaciones importantes , ya que permite tanto nuevas instalaciones como actualizaciones en el único MSI. UpgradeCode está fijado a un Guid único y nunca cambiará, a menos que no queramos actualizar el producto existente.
Nota : ¡En WiX 3.5 hay un nuevo elemento MajorUpgrade que hace la vida aún más fácil !
Crear un icono en Agregar o quitar programas
En las versiones de lanzamiento, versionamos nuestros instaladores, copiando el archivo msi en un directorio de implementación. Un ejemplo de esto usando un objetivo wixproj llamado desde el destino AfterBuild:
Use calor para cosechar archivos con comodín (*) Guid. Útil si desea reutilizar archivos WXS en varios proyectos (consulte mi respuesta en varias versiones del mismo producto). Por ejemplo, este archivo por lotes cosecha automáticamente la salida de RoboHelp.
Están sucediendo algunas cosas,
robocopy
es eliminar los metadatos de la copia de trabajo de Subversion antes de cosechar; la-dr
referencia del directorio raíz se establece en nuestra ubicación de instalación en lugar de TARGETDIR predeterminada;-var
se usa para crear una variable para especificar el directorio de origen (salida de implementación web).Una manera fácil de incluir la versión del producto en el título del cuadro de diálogo de bienvenida utilizando Strings.wxl para la localización. (Crédito: saschabeaumont . Agregado ya que este gran consejo está oculto en un comentario)
Ahórrese un poco de dolor y siga los consejos de Wim Coehen de un componente por archivo. Esto también le permite omitir (o comodín
*
) el GUID del componente .Rob Mensching tiene una forma ordenada de localizar rápidamente los problemas en los archivos de registro de MSI mediante la búsqueda
value 3
. Tenga en cuenta los comentarios sobre la internacionalización.Al agregar características condicionales, es más intuitivo establecer el nivel de característica predeterminado en 0 (deshabilitado) y luego establecer el nivel de condición en el valor deseado. Si establece el nivel de característica predeterminado> = 1, el nivel de condición debe ser 0 para deshabilitarlo, lo que significa que la lógica de la condición debe ser lo contrario de lo que esperaría, lo que puede ser confuso :)
fuente
Comprobando si IIS está instalado:
Comprobando si IIS 6 Metabase Compatibility está instalado en Vista +:
fuente
Mantenga todas las ID en espacios de nombres separados
F.
Ejemplos: F.Documentation, F.Binaries, F.SampleCode.C.
Ej: C.ChmFile, C.ReleaseNotes, C.LicenseFile, C.IniFile, C.RegistryCA.
Ej: CA.LaunchHelp, CA.UpdateReadyDlg, CA.SetPropertyXFi.
Di.
Creo que esto ayuda enormemente a realizar un seguimiento de todos los diversos identificadores en todas las diversas categorías.
fuente
Fantástica pregunta Me encantaría ver algunas de las mejores prácticas que se muestran.
Tengo muchos archivos que distribuyo, así que configuré mi proyecto en varios archivos fuente wxs.
Tengo un archivo fuente de nivel superior que llamo Product.wxs que básicamente contiene la estructura para la instalación, pero no los componentes reales. Este archivo tiene varias secciones:
El resto de los archivos .wix se componen de fragmentos que contienen grupos de componentes a los que se hace referencia en la etiqueta Feature en Product.wxs. Mi proyecto contiene una buena agrupación lógica de los archivos que distribuyo
Esto no es perfecto, mi sentido de la araña OO hormiguea un poco porque los fragmentos tienen que hacer referencia a los nombres en el archivo Product.wxs (por ejemplo, DirectoryRef), pero me resulta más fácil mantener que un solo archivo fuente grande.
¡Me encantaría escuchar comentarios sobre esto, o si alguien tiene buenos consejos también!
fuente
Agregue una casilla de verificación al cuadro de diálogo de salida para iniciar la aplicación o el archivo de ayuda.
...
Si lo hace de esta manera, la apariencia "estándar" no es del todo correcta. La casilla de verificación es siempre un fondo gris, mientras que el cuadro de diálogo es blanco:
texto alternativo http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_1.gif
Una forma de evitar esto es especificar su propio ExitDialog personalizado, con una casilla de verificación ubicada de forma diferente . Esto funciona, pero parece mucho trabajo solo para cambiar el color de un control. Otra forma de resolver lo mismo es procesar posteriormente el MSI generado para cambiar los campos X, Y en la tabla Control para ese control CheckBox en particular. El código javascript se ve así:
Ejecutar este código como un script de línea de comandos (usando cscript.exe) después de que se genere el MSI (desde light.exe) producirá un ExitDialog que se verá más profesional:
texto alternativo http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_2.gif
fuente
WIXUI_EXITDIALOGOPTIONALCHECKBOX
porWIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
dentro<Publish>
Creando versiones Live, Test, Training, ... usando los mismos archivos fuente.
En pocas palabras: cree un UpgradeCode único para cada instalador y defina automáticamente el primer carácter de cada Guid para cada instalador, dejando los 31 restantes restantes.
Prerrequisitos
Supuestos
Estructura de directorios
Proceso
Ejemplo Config.wxi
Ejemplo Config.Common.wxi
Componentes de ejemplo.wxs
Nota: ahora sugeriría dejar el atributo Guid fuera del componente (equivalente a
*
), usando un archivo por componente y configurando el archivo como la ruta de acceso clave. Esto elimina la necesidad de llamadasModifyComponentsGuids
yRevertComponentsGuids
objetivos que se muestran a continuación. Sin embargo, esto podría no ser posible para todos sus componentes.Ejemplo Setup.Live.wixproj
Pensamientos finales
ACTUALIZACIÓN 1: la generación automática de guías de componentes elimina la necesidad de llamar a la tarea FileUpdate si crea un componente con Guid = "*" para cada archivo, configurando el archivo como la ruta de acceso de clave.
ACTUALIZACIÓN 2: Uno de los problemas con los que nos hemos encontrado es que si no genera automáticamente sus Guid de componentes y la compilación falla, entonces los archivos temporales deben eliminarse manualmente.ACTUALIZACIÓN 3: Se encontró una manera de eliminar la dependencia de svn: creación de archivos externos y temporales. Esto hace que el proceso de construcción sea más resistente (y es la mejor opción si no puede usar comodines para sus Guías) y menos frágil si hay un fallo de construcción en la luz o la vela.
ACTUALIZACIÓN 4: El soporte para múltiples instancias que usan transformaciones de instancias está en WiX 3.0+, definitivamente también vale la pena echarle un vistazo.
fuente
Uso del registro de diagnóstico de Msi para obtener información detallada sobre fallas
msiexec /i Package.msi /l*v c:\Package.log
Dónde
es el nombre de su paquete y es donde desea la salida del registroCódigos de error Msi
Video introductorio de Wix
Oh y el video introductorio aleatorio de Wix con "Mr. WiX" Rob Mensching es útil para el "panorama general".
fuente
Use Javascript CustomActions porque son muy fáciles
La gente ha dicho que Javascript es incorrecto para MSA CustomActions . Razones dadas: difícil de depurar, difícil de hacer confiable. No estoy de acuerdo No es difícil de depurar, ciertamente no es más difícil que C ++. Es simplemente diferente. Descubrí que escribir CustomActions en Javascript es muy fácil, mucho más fácil que usar C ++. Mucho mas rápido. E igual de confiable.
Solo hay un inconveniente: Javascript CustomActions se puede extraer a través de Orca, mientras que un CA C / C ++ requeriría ingeniería inversa. Si considera que su magia de instalador es propiedad intelectual protegida, querrá evitar el script.
Si usa script, solo necesita comenzar con alguna estructura. Aquí hay algunos para comenzar.
Código Javascript "repetitivo" para CustomAction:
Luego, registre la acción personalizada con algo como esto:
Por supuesto, puede insertar tantas funciones de Javascript como desee, para múltiples acciones personalizadas. Un ejemplo: utilicé Javascript para hacer una consulta WMI en IIS, para obtener una lista de sitios web existentes, en los que se podría instalar un filtro ISAPI. Esta lista se utilizó para completar un cuadro de lista que se muestra más adelante en la secuencia de la interfaz de usuario. Todo muy facil.
En IIS7, no hay un proveedor de WMI para IIS, por lo que utilicé el
shell.Run()
método para invocar appcmd.exe para realizar el trabajo. Fácil.Pregunta relacionada: Acerca de Javascript CustomActions
fuente
Peter Tate ya ha mostrado cómo puede definir definiciones reutilizables de ComponentGroup en fragmentos wix separados. Algunos trucos adicionales relacionados con esto:
Alias de directorio
Los fragmentos del grupo de componentes no necesitan conocer los directorios definidos por el producto principal wxs. En su fragmento de grupo de componentes puede hablar sobre una carpeta como esta:
Entonces el producto principal puede alias uno de sus directorios (por ejemplo, "productInstallFolder") de esta manera:
Gráfico de dependencia
Los elementos ComponentGroup pueden contener elementos secundarios ComponentGroupRef. Esto es excelente si tiene un gran grupo de componentes reutilizables con un gráfico de dependencia complejo entre ellos. Simplemente configura un ComponentGroup en su propio fragmento para cada componente y declara las dependencias de esta manera:
Si ahora hace referencia al grupo de componentes "B" en su configuración porque es una dependencia directa de su aplicación, automáticamente extraerá el grupo de componentes "A" incluso si el autor de la aplicación nunca se dio cuenta de que era una dependencia de "B". "Simplemente funciona" siempre que no tenga dependencias circulares.
Wixlib reutilizable
La idea del gráfico de dependencia anterior funciona mejor si compila los componentes big-pool-o-reusable en un wixlib reutilizable con lit.exe. Al crear una configuración de aplicación, puede hacer referencia a este wixlib como un archivo wixobj. El enlazador candle.exe eliminará automáticamente cualquier fragmento que no sea "extraído" por los archivos wxs del producto principal.
fuente
Me sorprende que nadie haya mencionado el uso de T4 para generar el archivo WXS durante la compilación. Aprendí sobre esto a través de Henry Lee @ New Age Solutions .
Básicamente, crea una tarea personalizada de MSBuild para ejecutar una plantilla T4, y esa plantilla genera el WXS justo antes de que se compile el proyecto Wix. Esto le permite (dependiendo de cómo lo implemente) incluir automáticamente todos los resultados de los ensamblados al compilar otra solución (lo que significa que ya no tendrá que editar los wxs cada vez que agregue un nuevo ensamblaje).
fuente
Usando Heat.exe para aplastar la cara e infligir "Epic Pwnage" en instalaciones dolorosamente grandes
Ampliando las respuestas de Si y Robert-P sobre el calor.
Traducción: (Uso de calor para evitar escribir archivos individuales en el proyecto a mano y para automatizar las compilaciones para un proceso general más fácil).
Descripción detallada de la sintaxis de calor de WiX 2.0
Para las versiones más nuevas (no tan diferentes de las versiones anteriores, pero hay cambios de sintaxis potencialmente molestos ...) vaya al directorio Heat está en el cmd.exe y simplemente escriba heat, pero tengo un ejemplo aquí para obtener ayuda con versiones más nuevas si es necesario.
Agregar lo siguiente a su Evento de compilación en Visual Studio 2010.
(Haga clic con el botón derecho en Proyecto-> Propiedades -> Eventos de compilación-> Eventos de precompilación)
$(WIX)bin\heat.exe" dir "$(EnviromentVariable)" -cg GroupVariable -gg -scom -sreg -sfrag - srd -dr INSTALLLOCATION -var env.LogicPath -out "$(FragmentDir)\FileName.wxs
Genera guías cuando se ejecuta calor (como cuando ejecuta el comando anterior)
No tome "archivos COM"
No tome "Archivos de registro"
No agarres "Fragmentos"
No agarres el "directorio raíz"
dir indica que desea que Heat se vea en una carpeta
El nombre de la variable que agregaría a las variables de preprocesador en las propiedades del proyecto (Proyecto de clic derecho, Ir a propiedades )-> Generar, donde dice Definir variables de preprocesador (se supone Visual Studio 2010)
No hay comillas dobles pero terminan con punto y comaEl ComponentGroup al que se hará referencia desde el fragmento creado en el archivo wxs principal
El directorio de fragmentos donde se almacenará el fragmento wxs de salida
El nombre del archivo
Tutorial completo aquí, muy útil
Parte 1 Parte 2
fuente
Incluyendo objetos COM:
heat
genera la mayoría (si no todas) las entradas del registro y otra configuración necesaria para ellas. ¡Alegrarse!Incluidos los objetos COM administrados (también conocidos como objetos .NET o C # COM)
El uso
heat
en un objeto COM administrado le dará un documento wix casi completo.Si no necesita la biblioteca disponible en el GAC (es decir, disponible globalmente: la mayoría de las veces no necesita esto con sus ensamblados .NET de todos modos; probablemente haya hecho algo mal en este punto si no está destinado a ser una biblioteca compartida) querrá asegurarse de actualizar la
CodeBase
clave de registro para establecerla[#ComponentName]
. Si ESTÁ planeando instalarlo en el GAC (por ejemplo, ha creado una nueva biblioteca común impresionante que todos querrán usar), debe eliminar esta entrada y agregar dos nuevos atributos alFile
elemento:Assembly
yKeyPath
. El ensamblado debe establecerse en ".net" yKeyPath
debe establecerse en "sí".Sin embargo, algunos entornos (especialmente cualquier cosa con memoria administrada, como los lenguajes de secuencias de comandos) también necesitarán acceso a Typelib. Asegúrese de ejecutar
heat
en su typelib e incluirlo.heat
generará todas las claves de registro necesarias. ¿Cuan genial es eso?fuente
Instalando a
C:\ProductName
Algunas aplicaciones deben instalarse
C:\ProductName
o algo similar, pero el 99.9% (si no el 100%) de los ejemplos en la instalación netaC:\Program Files\CompanyName\ProductName
.El siguiente código se puede usar para establecer la
TARGETDIR
propiedad en la raíz de laC:
unidad (tomada de la lista de usuarios de WiX ):NOTA: ¡ Por defecto,
TARGETDIR
no apunta aC:\
! Más bien apunta a loROOTDRIVE
que a su vez apunta a la raíz del disco con la mayor cantidad de espacio libre ( ver aquí ), y este no es necesariamente elC:
disco. ¡Puede haber otro disco duro, partición o unidad USB!Luego, en algún lugar debajo de su
<Product ...>
etiqueta, necesita las siguientes etiquetas de directorio como de costumbre:fuente
WindowsVolume
?WindowsVolume
propiedad no puede usarse como unDirectory
(el compilador da un error / advertencia), como se señala aquí y aquí . Personalmente, encuentro esta solución confusa.Variables ambientales
Al compilar sus documentos Wxs en código wixobj, puede utilizar variables ambientales para determinar información diversa. Por ejemplo, supongamos que desea cambiar qué archivos se incluyen en un proyecto. Digamos que tiene una variable de entorno llamada RELEASE_MODE, que establece justo antes de construir su MSI (ya sea con un script o manualmente, no importa) En su fuente wix, puede hacer algo como:
y luego en su código, úselo en el lugar para cambiar sobre la marcha su documento wxs, por ejemplo:
fuente
Usando el especial RobM "Recuerde la propiedad" patrón
http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern
fuente
Creación de acciones personalizadas para WIX escritas en código administrado (C #) sin Votive
http://www.codeproject.com/KB/install/wixcustomaction.aspx
fuente
Edición de cuadros de diálogo
Una buena capacidad para editar cuadros de diálogo es utilizar SharpDevelop en una versión 4.0.1.7090 (o superior). Con la ayuda de esta herramienta, se puede abrir, previsualizar y editar en la vista Diseño un cuadro de diálogo independiente (archivos wxs de fuentes WiX como, por ejemplo, InstallDirDlg.wxs).
fuente
Configuración de IIS enable32BitAppOnWin64 flag http://trycatchfail.com/blog/post/WiX-Snippet-change-enable32BitAppOnWin64.aspx
fuente
Modifique la opción "¿Listo para instalar?" diálogo (también conocido como VerifyReadyDlg) para proporcionar un resumen de las elecciones realizadas.
Se ve así:
texto alternativo http://i46.tinypic.com/s4th7t.jpg
Haga esto con una acción personalizada de Javascript:
Código Javascript:
Declare el Javascript CA:
Adjunte la CA a un botón. En este ejemplo, la CA se activa cuando se hace clic en Siguiente desde CustomizeDlg:
Pregunta SO relacionada: ¿Cómo puedo configurar, en tiempo de ejecución, el texto que se mostrará en VerifyReadyDlg?
fuente
Poner componentes que pueden ser parcheados individualmente dentro de sus propios fragmentos
Se aplica tanto a los instaladores de productos como a los parches que si incluye algún componente en un fragmento, debe incluir todos los componentes en ese fragmento. En el caso de crear un instalador, si pierde alguna referencia de componente, obtendrá un error de enlace de light.exe. Sin embargo, cuando realiza un parche, si incluye una referencia de componente único en un fragmento, todos los componentes modificados de ese fragmento aparecerán en su parche.
Me gusta esto:
en lugar de esto:
Además, al aplicar parches con el tema "Uso de Purely WiX" del archivo de ayuda WiX.chm, use este procedimiento para generar el parche:
no es suficiente tener la versión 1.1 del producto.wixpdb construida utilizando los componentes en fragmentos separados. Así que asegúrese de fragmentar correctamente su producto antes de enviarlo.
fuente
Imprimir EULA desde Wix3.0 y posterior
1) Cuando compila su código fuente wix, el light.exe debe hacer referencia a WixUIExtension.dll en la línea de comandos. Use el modificador de línea de comando -ext para esto.
2) Si al agregar la referencia a WixUIExtension.dll, su proyecto no se compila, probablemente se deba a conflictos de ID de diálogo, es decir, su proyecto estaba usando las mismas ID de diálogo que algunos diálogos estándar en WixUIExtension.dll, dar diferentes ID a sus cuadros de diálogo. Este es un problema bastante común.
3) Su diálogo de licencia debe tener control ScrollableText con la identificación "LicenseText". Wix busca exactamente este nombre de control cuando imprime.
y un PushButton que se refiere a la acción personalizada
4) Defina CustomAction con Id = "PrintEula" de esta manera:
Nota: BinaryKey es diferente en Wix3.0 en comparación con Wix2.0 y debe ser exactamente "WixUIWixca" (distingue entre mayúsculas y minúsculas).
Cuando el usuario presiona el botón, se le presentará el cuadro de diálogo Seleccionar impresora estándar y podrá imprimir desde allí.
fuente
Mostramos la versión del producto en algún lugar (pequeño) en la primera pantalla de la GUI. Porque las personas tienden a cometer errores al elegir la versión correcta cada vez. (Y mantengan a los desarrolladores buscando edades ...)
Hemos configurado TFSBuild para generar también transformaciones (archivos .mst) con la configuración para nuestros diferentes entornos. (Conocemos todos los entornos en los que debemos implementar).
Dado que la publicación original del blog de Grant Holliday no funciona, copié y pegué su contenido aquí:
Tarea MSBuild para generar archivos MSI Transform desde XMLMarch 11 2008
En mi publicación anterior describí cómo puede usar los archivos MSI Transform (* .mst) para separar los ajustes de configuración específicos del entorno de un paquete MSI genérico.
Aunque esto proporciona un nivel de flexibilidad en su configuración, hay dos desventajas de los archivos Transform:
Afortunadamente, podemos usar la Biblioteca de objetos de Microsoft Windows Installer (c: windowssystem32msi.dll) para abrir "bases de datos" de MSI y crear archivos de transformación.
Los créditos vuelven a Alex Shevchuk - De MSI a WiX - Parte 7 - Personalización de la instalación usando Transformaciones para mostrarnos cómo lograr esto con VbScript. Esencialmente, todo lo que he hecho es tomar el ejemplo de Alex y usar Interop.WindowsInstaller.dll he implementado una tarea MSBuild. La tarea de MSBuild
Descargue el código fuente y el ejemplo transforms.xml aquí (~ 7Kb Zipped VS2008 Solution)
fuente
Antes de implementar un paquete de instalación, siempre controlo el contenido del mismo.
Es solo una simple llamada en la línea de comando (según la publicación de Terrences) abra la línea de comando e ingrese
Esto extraerá el contenido del paquete a un subdirectorio 'Extraer' con la ruta actual.
fuente
En lugar de ORCA, use InstEd, que es una buena herramienta para ver tablas MSI. También tiene la capacidad de diferenciar dos paquetes por Transformar -> Comparar con ...
Además, está disponible una versión Plus con funcionalidad adicional. Pero también la versión gratuita ofrece una buena alternativa para Orca.
fuente
Registro de ensamblados .NET para COM Interop con compatibilidad x86 / x64
Nota: este fragmento es esencialmente el mismo que REGASM Assembly.dll / codebase
Están sucediendo un par de cosas en este ejemplo, así que aquí está el código y lo explicaré después ...
Si se preguntaba, esto es en realidad para un controlador de telescopio ASCOM .
Primero, tomé el consejo de arriba y creé algunas variables de plataforma en un archivo separado, puedes verlas dispersas a través del XML.
La parte if-then-else cerca de la parte superior trata con la compatibilidad x86 vs x64. Mi ensamblaje apunta a 'Cualquier CPU', por lo que en un sistema x64, necesito registrarlo dos veces, una en el registro de 64 bits y otra en las
Wow6432Node
áreas de 32 bits . If-then-else me prepara para esto, los valores se usan en unforeach
bucle más adelante. De esta manera, solo tengo que crear las claves de registro una vez (principio DRY).El elemento de archivo especifica el dll de ensamblado real que se instala y registra:
Nada revolucionario, pero
Assembly=".net"
tenga en cuenta que , este atributo solo haría que la asamblea se coloque en el GAC, que NO es lo que quería. Usar elAssemblyApplication
atributo para volver a apuntar a sí mismo es simplemente una forma de evitar que Wix coloque el archivo en el GAC. Ahora que Wix sabe que es un ensamblado .net, sin embargo, me permite usar ciertas variables de carpeta dentro de mi XML, como el!(bind.assemblyFullname.filDriverAssembly)
para obtener el nombre completo del ensamblado.fuente
Establezca la
DISABLEADVTSHORTCUTS
propiedad para forzar que todos los accesos directos anunciados en su instalador se conviertan en accesos directos regulares, y no necesita incluir una clave de registro ficticia para utilizarla como ruta de acceso de teclado.Creo que Windows Installer 4.0 o superior es un requisito .
fuente
Es una estructura agradable pero, según mi experiencia, me pregunto cómo abordas estas condiciones:
R. Sus instalaciones parecen aterrizar en el mismo destino. Si un usuario necesita instalar las 3 versiones a la vez, su proceso lo permitirá. ¿Pueden decir inequívocamente qué versión de cada ejecutable están activando?
B. ¿Cómo maneja los archivos nuevos que existen en PRUEBA y / o ENTRENAMIENTO pero que aún no están en VIVO?
fuente
Aquí hay una manera de ayudar a los grandes proyectos web a verificar que la cantidad de archivos implementados coincida con la cantidad de archivos integrados en un MSI (o módulo de fusión). Acabo de ejecutar la tarea personalizada MSBuild contra nuestra aplicación principal (todavía en desarrollo) y recogió bastantes archivos faltantes, en su mayoría imágenes, ¡pero algunos archivos javascript se deslizaron hasta!
Este enfoque (echar un vistazo a la tabla de archivos de MSI al conectarse al destino AfterBuild del proyecto WiX) podría funcionar para otros tipos de aplicaciones en las que tiene acceso a una lista completa de archivos esperados.
fuente
Realizar una reinstalación forzada cuando una instalación no permite la desinstalación o reinstalación y no se revierte.
Secuencia de comandos VBscript utilizada para anular una instalación que no se desinstala por cualquier motivo.
fuente
Cree una IU que tenga una acción personalizada que establecerá una variable y la UI deshabilitará / habilitará el siguiente botón (o similar) según la variable establecida en la acción personalizada.
No es tan sencillo como podría pensar, ¡no es demasiado difícil, simplemente no está documentado en ningún lado!
Interacciones de Wix con condiciones, propiedades y acciones personalizadas
fuente