como crear instaladores con NSIS
Publicado 18 de Octubre de 2025 a las 12:46 por marco
Guía de Scripting NSIS: Implementación Modular
Este documento detalla la creación de instaladores con NSIS (Nullsoft Scriptable Install System), centrándose en la configuración de la interfaz de usuario (MUI), la gestión de componentes opcionales mediante secciones y la manipulación del registro de Windows para asociaciones de archivos.
1. Configuración General y Localización
Define los parámetros básicos del instalador, el nombre del producto y el idioma.
1.1. Configuración de Idioma (MUI)
Para utilizar la interfaz moderna y configurar el idioma, se incluye el archivo MUI2 y se define la localización:
!include MUI2.nsh
!insertmacro MUI_LANGUAGE "Spanish"
; Utilice "English", "Portuguese", etc., según sea necesario.
1.2. Metadatos del Instalador
Especifica el archivo de salida, el nombre del programa y la ruta de instalación por defecto.
OutFile "Instalador_Aplicacion.exe"
Name "Nombre del Proyecto"
InstallDir "$PROGRAMFILES\NombreDelProyecto" ; Variable estándar de Windows
2. Control de Flujo y Componentes Modulares
La página components
es la clave para ofrecer opciones de instalación al usuario (la interfaz gráfica con *checkboxes*).
2.1. Flujo de Páginas
Se deben declarar las páginas en el orden deseado, incluyendo la de componentes:
Page directory ; Selección del directorio de destino
Page components ; Selección de las secciones opcionales/requeridas
Page instfiles ; Progreso de la instalación
2.2. Definición de Secciones
Las secciones definen bloques de código y las opciones de usuario:
Section "Nombre"
: Opción marcada por defecto.Section /o "Nombre"
: Opción **desmarcada** por defecto (opcional).SectionIn RO
: Hace que la sección sea obligatoria (solo lectura).SectionGroup
: Agrupa visualmente secciones en la interfaz.Section "Uninstall"
: Sección reservada obligatoria para la desinstalación.
2.3. Copia de Archivos
El comando File
se utiliza para copiar archivos desde la fuente (donde está el `.nsi`) al destino ($INSTDIR
):
Section "Archivos Base" SecBase
SectionIn RO
SetOutPath "$INSTDIR" ; Establece la carpeta de destino
File "C:\Ruta\Al\Ejecutable.exe"
File /r "C:\Ruta\A\Carpeta\_internal" ; /r copia el contenido recursivamente
WriteUninstaller "uninst.exe" ; Crea el desinstalador
SectionEnd
3. Asociaciones de Archivos y Accesos Directos
3.1. Creación de Accesos Directos
Se utiliza CreateShortCut
para crear enlaces en ubicaciones estándar de Windows. Variables comunes son $DESKTOP
y $SMPROGRAMS
(Menú de Inicio).
; Acceso directo en Escritorio
CreateShortCut "$DESKTOP\MiApp.lnk" "$INSTDIR\Ejecutable.exe"
; Acceso directo y Desinstalador en carpeta del Menú de Inicio
CreateShortCut "$SMPROGRAMS\MiApp\MiApp.lnk" "$INSTDIR\Ejecutable.exe"
CreateShortCut "$SMPROGRAMS\MiApp\Desinstalar.lnk" "$INSTDIR\uninst.exe"
3.2. Asociaciones de Archivos
Esto requiere modificar el registro (HKCR
) para definir qué aplicación abre una extensión. Es crucial para archivos multimedia como .mp3
, .wav
, etc.
Section /o "Asociar archivos MP3 (.mp3)" SecAssocMP3
; 1. Asocia la extensión (.mp3) a un identificador único (MiApp_Audio)
WriteRegStr HKCR ".mp3" "" "MiApp_Audio"
; 2. Define la descripción del tipo de archivo (visible en Explorer)
WriteRegStr HKCR "MiApp_Audio" "" "Archivo de Audio (MiApp)"
; 3. Define el comando para abrir: utiliza %1 para la ruta del archivo
WriteRegStr HKCR "MiApp_Audio\shell\open\command" "" '"$INSTDIR\Ejecutable.exe" "%1"'
SectionEnd
!macro
) para reducir la repetición de código.
4. Finalización y Acciones Personalizadas
4.1. Opciones en la Página Final
La página de finalización (MUI_PAGE_FINISH
) puede incluir acciones directas, como iniciar la aplicación o abrir un documento.
!define MUI_FINISHPAGE_RUN ; Habilita la casilla para ejecutar el programa
!define MUI_FINISHPAGE_RUN_TEXT "Iniciar Aplicación"
!define MUI_FINISHPAGE_RUN_COMMAND "$INSTDIR\App.exe"
!define MUI_FINISHPAGE_LINK ; Habilita un enlace opcional
!define MUI_FINISHPAGE_LINK_TEXT "Ver Documentación"
!define MUI_FINISHPAGE_LINK_FUNCTION AbrirDocumento ; Llama a una función
!insertmacro MUI_PAGE_FINISH
; Definición de la función para abrir la documentación
Function AbrirDocumento
; ExecShell "open" utiliza el programa predeterminado (navegador)
ExecShell "open" "$INSTDIR\documentacion\manual.html"
FunctionEnd
4.2. La Sección de Desinstalación (`Uninstall`)
Esta sección debe **revertir** cada acción de registro, archivo o acceso directo creado. Su nombre es fijo.
Section "Uninstall"
; 1. Remover Accesos Directos
Delete "$DESKTOP\MiApp.lnk"
RMDir "$SMPROGRAMS\MiApp" ; Borra la carpeta si está vacía
; 2. Remover Entradas de Registro (Asociaciones)
DeleteRegKey HKCR ".mp3"
DeleteRegKey HKCR "MiApp_Audio"
; 3. Remover el Programa de la lista de Windows
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MiProyectoBase"
; 4. Borrar Archivos y la carpeta de instalación
Delete "$INSTDIR\uninst.exe"
RMDir /r "$INSTDIR"
SectionEnd
5. Script de Instalador Básico Completo (Ejemplo)
Este código integra la estructura básica, un componente opcional y la funcionalidad de desinstalación. Asuma que los archivos App.exe
y doc.txt
se encuentran en la misma carpeta que este script.
; --- CONFIGURACIÓN GLOBAL ---
!include MUI2.nsh
!insertmacro MUI_LANGUAGE "Spanish"
OutFile "Instalador_Base.exe"
Name "App Ejemplo NSIS"
InstallDir "$PROGRAMFILES\AppEjemplo"
; --- CONFIGURACIÓN DE PÁGINAS ---
Page directory
Page components
Page instfiles
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT "Iniciar Aplicación"
!define MUI_FINISHPAGE_RUN_COMMAND "$INSTDIR\App.exe"
!insertmacro MUI_PAGE_FINISH
; --- FUNCIÓN ADICIONAL ---
Function AbrirDocumentacion
ExecShell "open" "$INSTDIR\doc.txt"
FunctionEnd
; --- SECCIÓN OBLIGATORIA ---
Section "Archivos Requeridos" SecRequeridos
SectionIn RO
SetOutPath "$INSTDIR"
File "App.exe"
File "doc.txt" ; Archivo que usaremos para la documentación
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AppEjemplo" "DisplayName" "App Ejemplo NSIS"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AppEjemplo" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteUninstaller "uninst.exe"
SectionEnd
; --- SECCIÓN OPCIONAL (Acceso Directo) ---
Section /o "Crear Acceso en Escritorio" SecDesktop
CreateShortCut "$DESKTOP\App Ejemplo.lnk" "$INSTDIR\App.exe"
SectionEnd
; --- SECCIÓN DE DESINSTALACIÓN ---
Section "Uninstall"
Delete "$DESKTOP\App Ejemplo.lnk"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AppEjemplo"
Delete "$INSTDIR\uninst.exe"
Delete "$INSTDIR\App.exe"
Delete "$INSTDIR\doc.txt"
RMDir "$INSTDIR"
SectionEnd