NSIS - Empaquetar nuestro programa (Crear paquete de instalación)

Crear instalador para Windows con NSIS

En este post te enseñaré cómo hacer un Asistente de instalación en Windows para distribuir tus programas de manera simple y sencilla. Es decir, vamos a crear un Instalador de paquete.

Con lo que te mostraré vas a poder empacar tus programas y sus dependencias (imágenes, texturas, assets) en un ejecutable donde el usuario únicamente hará clic al botón de “Siguiente” y en donde tú podrás controlar cada paso de la instalación incluyendo ubicación, accesos directos, proceso de instalación, desinstalación y otras cosas.

Para ello vamos a usar NSIS y HM NIS Edit, programas muy buenos, simples y que funcionan perfectamente incluso en Windows 10 y 11.

Descargar programas

El software que usaremos para crear instaladores para nuestras aplicaciones se puede descargar desde los siguientes enlaces. Es totalmente gratuito y open source:

Si los enlaces no funcionan o cambian en el futuro simplemente busca los programas por su nombre en Google o tu buscador favorito.

Creando script de instalación

Debemos programar un script que NSIS va a “compilar”. Para ello es que vamos a usar HM NIS Edit, que permite crear scripts con un asistente o a través de plantillas.

Yo recomiendo abrirlo y crear uno con el asistente (Archivo > Nuevo script desde el asistente) para empezar a probar, ya que nos deja con una plantilla que podemos modificar.

Crear instalador de programa para Windows - Empaquetar software
Crear instalador de programa para Windows – Empaquetar software

No te preocupes si llenas los parámetros con valores que no existen o con valores de prueba, más adelante podrás personalizar y entender todo.

En mi caso me generó un script así:

Obviamente para mi instalador he modificado varias cosas y ahora te voy a mostrar cuáles fueron, sección por sección.

Definiendo variables

Me gusta tener las cosas ordenadas así que he definido variables para el nombre de mi ejecutable principal y cosas por el estilo. También he deshabilitado la licencia pues no necesito que los usuarios acepten algo (por ahora). El inicio quedó así:

Tú puedes definir tus propios valores para no estar escribiéndolos en cada línea donde necesites referenciarlos, y si necesitas cambiarlos puedes hacerlo en un solo lugar.

Función al terminar instalación

Como te dije anteriormente, con este creador de instaladores de paquetes podemos controlar varios pasos del proceso de la instalación. Uno de ellos se ejecuta cuando la instalación ha terminado; podemos ejecutar un comando o una función; yo me he decidido por una función y queda así:

Lo que estoy haciendo es ejecutar mi programa principal (mismo que inicia un servidor web) y luego abrir la URL de ese servidor en el navegador web por defecto. Obviamente puedes hacer más cosas aquí, pero yo solo estoy haciendo 2 cosas con Exec y ExecShell.

Ubicación de instalación

El asistente te va a preguntar la ruta de instalación de tu programa. Normalmente será en Program Files pero en mi caso específico tuve problemas al hacerlo, porque mi aplicación no se ejecutaba si no lo hacía con permisos de administrador.

La solución fue cambiar la ruta de instalación a AppData así:

Para referirnos a esa carpeta simplemente indicamos $APPDATA. Recuerda que PRODUCT_NAME ya está definido anteriormente.

Nota: no hay diferencia entre $VARIABLE y ${VARIABLE} pero yo recomiendo usar la segunda forma.

Sección principal: archivos a instalar

Llegamos a la parte que yo considero más importante. Cuando queremos distribuir un programa para Windows y empaquetar todo en un instalador necesitamos indicar cuáles archivos van a instalarse o copiarse en la computadora del usuario.

Usamos File para indicar que debe tomar un archivo de nuestra computadora (puede ser relativo o absoluto) e instalarlo en la ruta de instalación previamente definida.

También podemos copiar directorios completos, para ello primero debemos movernos al directorio donde queremos copiar el contenido del directorio y luego hacer un File /r.

Igualmente en este paso es donde podemos crear accesos directos e incluso hacer que el programa instalado inicie con Windows automáticamente. En mi caso esta sección queda así:

Fíjate que en la línea 6 me muevo a la carpeta dist que será creada si no existe y luego de eso copio recursivamente la carpeta dist. Ese comando copiará todo el contenido de esa carpeta pero no a la propia carpeta, por eso es que necesito “moverme” de directorio antes de ejecutar ese comando, y para ello uso SetOutPath.

También estoy haciendo que mi programa inicie con Windows en la línea 9, y finalmente estoy creando un acceso directo al sitio con WriteIniStr ya que (lo descubrí al hacerlo) esos accesos son simples archivos ini.

Nota: $DESKTOP es el escritorio del usuario.

Desinstalación

Con NSIS podemos indicar el proceso de desinstalación del programa. Recuerda que esto es importante para que el usuario tenga control sobre nuestro software.

La desinstalación en mi caso necesita más cosas ya que tengo que borrar otras carpetas y archivos. En mi caso queda así:

Por ejemplo, necesito detener mi servidor con otro programa que incluyo en la instalación, así que lo ejecuto, espero 5 segundos y después ya puedo borrar todo lo demás.

No olvides que $INSTDIR es la ruta de instalación de nuestro programa.

Como puedes ver también estoy eliminando la carpeta dist y fotos_platillos de manera recursiva así como todos los archivos con extensión .db y .log ya que esos archivos son creados por mi programa.

Por cierto, RMDir no va a funcionar si el directorio tiene contenido (por ello es que cuando quiero que lo haga recursivamente especifico /r), así que asegúrate de vaciar la carpeta antes de intentar borrarla en la línea 20.

Creando instalador

Cuando ya tenemos nuestro script (modificado con HM NIS Edit) podemos “compilarlo” creando el instalador yendo a NSIS > Compilar. El instalador estará en la misma ubicación que el script.

NSIS - Empaquetar nuestro programa (Crear paquete de instalación)
NSIS – Empaquetar nuestro programa (Crear paquete de instalación)

Si hay algún problema (como errores de sintaxis o archivos no referenciados correctamente) el editor te lo va a decir. Solo es cuestión de ajustar las cosas así como cuando programamos en cualquier otro lenguaje.

Bonus: automatizar creación de instalador

Una vez que hayas probado tu script, puedes automatizar la creación del paquete de instalación.

Al final lo que hace el editor es invocar a NSIS, concretamente al binario makensis; así que basta con agregar la carpeta que lo contiene (en mi caso es C:\Program Files (x86)\NSIS\) a la PATH y luego invocarlo así:

makensis script.nsi

Yo he llevado el proceso más allá y he creado un script de Python que compila mi frontend, backend, calcula sumas de verificación y crea el instalador. Aquí te lo dejo:

Fíjate en que estoy invocando a makensis en la línea 132.

Obviamente este instalador sirve para todo tipo de programas. Yo lo he usado para distribuir mi webapp y funciona como un encanto.

Poniendo todo junto

Hasta este punto te he mostrado los aspectos más importantes y cómo es que he modificado el script para ajustarlo a mis necesidades.

Obviamente puedes hacer muchas cosas más, solo es cuestión de leer la documentación para poder hacer lo que necesitas.

Para terminar te dejo mi script completo aunque ya te mostré lo más importante.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario