La creación de paquetes de instalación para aplicaciones Windows puede automatizarse eficazmente utilizando WiX (Windows Installer XML) en conjunto con MSBuild. Este enfoque permite integrar la generación de archivos .mssi directamente en el proceso de compilación, garantizando que el paquete se actualice automáticamente con los cambios en el código fuente. A continuación, se describe un flujo de trabajo básico para configurar un proyecto de instalación simple con WiX Toolset versión 3.7 o superior, enfocándose en la generación automatizada mediante MSBuild.
Configuración Inicial del Proyecto
Comience creando una aplicación de Windows Forms como proyecto principal en Visual Studio. Después, en la misma solución, agregue un nuevo proyecto del tipo "Setup Project" bajo la categoría Windows Installer XML. Asigne un nombre descriptivo, como "InstaladorDemo". Visual Studio generará automáticamente un archivo de proyecto con extensión .wixproj y un archivo de definición XML denominado Product.wxs. Este último es el punto de partida para configurar el paquete de instalación.
Modificación del Archivo de Definición (Product.wxs)
El archivo Product.wxs conitene la estructura XML que define el instalador. Para un ejemplo básico, edite el elemento Product para incluir información esencial como el nombre, versión y fabricante. Asegúrese de proporcionar GUIDs únicos para los atributos Id y UpgradeCode, los cuales se pueden generar con herramientas como la utilidad de Visual Studio. A continuación, se muestra un ejemplo con nombres alterados:
<Product Id="{12345678-1234-1234-1234-123456789abc}" Name="InstaladorDemo" Language="1033" Version="1.0.0.0" Manufacturer="MiEmpresa" UpgradeCode="{abcdef12-3456-7890-abcd-ef1234567890}">
En el bloque Fragment que contiene el componente, vincule el ejecutable de la aplicación usando una variable de referencia. Cambie el identificador del componente y la ruta según su proyecto:
<Component Id="CompPrincipal">
<File Source="$(var.AplicacionEjemplo.RutaDestino)" />
</Component>
Al compilar la solución, MSBuild procesará el proyecto WiX y generará un archivo InstaladorDemo.msi en el directorio de salida del proyecto de instalación. Este proceso es automático: cada vez que se modifica la aplicación principal y se recompila, el paquete .msi se regenera si es necesario.
Integración con MSBuild y el Archivo .wixproj
El archivo .wixproj, generado por Visual Studio, define cómo MSBuild debe construir el paquete de instalación. Este archivo XML incluye propiedades como la configuración de compilación, rutas de salida y referencias a otros proyectos. Un fragmento simplificado podría verse así:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputName>InstaladorDemo</OutputName>
<OutputType>Package</OutputType>
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AplicacionEjemplo\AplicacionEjemplo.csproj">
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>CARPETA_INSTALACION</RefTargetDir>
</ProjectReference>
</ItemGroup>
<Import Project="$(WixTargetsPath)" />
</Project>
Este archivo permite a MSBuild compilar el archivo .wxs y resolver referencias de proyecto, facilitando la generación automática del instalador durante la compilación.
Elementos XML Clave en WiX
WiX utiliza un vocabulario XML específico para describir el instalador. Los elementos fundamentales incluyen:
- Product: Define metadatos globales del paquete, como el nombre, versión y código de actualización. Debe ser hijo directo del elemento raíz
Wix. - Package: Contiene detalles técnicos del instalador, como la versión mínima de Windows Installer reuqerida y el alcance de la instalación (perUser o perMachine).
- MajorUpgrade: Controla la actualización entre versiones principales, permitiendo configurar mensajes de error para intentos de degradación.
- Feature: Representa una unidad instalable. Puede contener referencias a componentes que el usuario puede seleccionar o deseleccionar durante la instalación.
- Fragment: Agrupa elementos reutilizables, como definiciones de directorios o componentes. Cualquier referencia dentro de un fragmento debe tener un elemento correspondiente en otro lugar del documento.
- Directory: Especifica la estructura de carpetas para la instalación. Por ejemplo, el directorio raíz TARGETDIR se mapea típicamente a la carpeta Program Files.
Variables de Referencia en WiX
WiX provee variables predefinidas para acceder a rutas y propiedades de proyectos referenciados. Por ejemplo, $(var.NombreProyecto.RutaDestino) se resuelve a la ruta completa del archivo de salida del proyecto especificado. Estas variables se actualizan dinámicamente durante la compilación, lo que garantiza que el instalador incluya siempre la versión más reciente de los archivos.
Al configurar referencias de proyecto en el archivo .wixproj, se habilita el uso de estas variables para simplificar la inclusión de archivos en el paquete de instalación.