ES

jumphp2installer: un instalador para tu software

jumphp2installer crea instaladores nativos de verdad para Windows, macOS y Linux, para tu juego, tu app JumPHP o cualquier software. Escribes un pequeño script YAML legible, y tus usuarios descargan un solo archivo. Les muestra un asistente (bienvenida, licencia, carpeta, opciones), instala siempre la última versión y añade un desinstalador. Es libre y de código abierto: github.com/davidnurdin/jumphp2installer.

La página de bienvenida del asistente de instalación
Bienvenida
La licencia que hay que aceptar
Licencia
La elección de la carpeta de instalación
Carpeta
Las opciones: accesos directos
Opciones
El final de la instalación
Terminado

Qué hace

  • Un archivo por sistema: Mi-App-setup.exe (Windows 10 y 11), Mi-App-setup-macos.zip (Mac Apple silicon e Intel), Mi-App-setup-linux-x86_64. No hay que instalar nada antes.
  • Siempre la última versión: el instalador lee tu script al arrancar. Un instalador descargado hace un año instala, por tanto, la versión de hoy.
  • Un asistente con tus colores: tu nombre, tu icono, tu imagen lateral, tu color, tu licencia y tus textos. En inglés o en francés, según el idioma del ordenador.
  • Los pasos habituales: descargar (con comprobación SHA-256), descomprimir (.zip, .tar.gz), copiar, escribir un archivo, hacer ejecutable, lanzar un comando, crear accesos directos (escritorio, menú).
  • Un desinstalador de verdad: aparece en «Aplicaciones» de Windows y en el menú de Linux. Quita exactamente lo que creó la instalación, y nada más.
  • Sin derechos de administrador: todo se instala para el usuario, en su propia carpeta de programas.
  • También por línea de comandos: --silent instala sin ventana (despliegues, scripts, CI).

El script de instalación

Un archivo install.yaml dice lo que el instalador muestra (pages) y lo que hace (steps). El mismo script sirve en los tres sistemas: las variables ({folder}, {platform}, {exe}…) y la clave os: se ocupan de las diferencias.

app:
  name: Mi App
  publisher: Yo
  website: https://ejemplo.es
  icon: icon.png
  banner: banner.png          # la imagen a la izquierda del asistente (172 x 420)
  accent: "#2f6fed"

version:
  github: yo/mi-app           # la última release de GitHub da {version}

pages:
  - welcome
  - license: LICENSE.txt
  - folder: "{programs}/{app}"
  - options:
      desktop: Un acceso directo en el escritorio
  - install
  - finish: {run: "{folder}/mi-app{exe}"}

steps:
  - download: https://github.com/yo/mi-app/releases/download/v{version}/mi-app-{platform}.zip
  - extract: {strip: 1}
  - executable: "{folder}/mi-app"
    os: [linux, macos]
  - shortcut: {target: "{folder}/mi-app{exe}", where: desktop}
    if: desktop
  - uninstaller

Las páginas

Página Lo que muestra
welcome un texto de bienvenida (por defecto: «Bienvenido a la instalación de {app} {version}»)
license un archivo del paquete, que hay que aceptar para continuar
folder la carpeta, con «Examinar…», el espacio necesario y el libre; avisa si la carpeta ya se usa
options casillas, reutilizadas por los pasos (if: desktop)
install la barra de progreso y el detalle
finish el final, con una casilla «Iniciar {app}» (run, que puede cambiar según el sistema)

Los pasos

Paso
download una dirección, o un archivo del paquete; sha256 lo detiene todo si el archivo no es el correcto
extract descomprime en {folder}; strip: 1 quita la carpeta raíz del archivo comprimido
copy, mkdir, write, delete archivos y carpetas (delete solo toca la carpeta de instalación, la del usuario y la temporal)
executable hace ejecutable un archivo (Linux, macOS)
shortcut desktop, menu o both: .lnk en Windows, .desktop en Linux, un enlace en macOS
run lanza un comando en la carpeta
uninstaller instala el desinstalador y lo registra en el sistema

Cada paso acepta if: (una opción marcada, o "!opción"), os: (windows, macos, linux) y label:.

La versión

Escritura {version}
version: 1.4.0 fija
version: {github: yo/mi-app} la última release del repositorio (su tag, sin la v)
version: {latest: https://…/latest.json} lo que responde la dirección: {"version": "1.4.0"} o texto

Las variables

Variable Windows Linux macOS
{programs} %LOCALAPPDATA%\Programs ~/.local/opt ~/Applications
{desktop}, {menu} escritorio, menú Inicio escritorio, ~/.local/share/applications ~/Desktop
{platform} windows-x86_64 linux-x86_64 macos-arm64 / macos-x86_64
{exe} .exe (vacío) (vacío)
{folder}, {app}, {version}, {home}, {temp}, {os}, {arch}, {download}

La referencia completa está en docs/installer/script.md.

Tres formas de publicarlo

1. En jumphp.net, sin instalar nada

En el estudio, «Nuevo instalador» abre un editor:

  • el script YAML se comprueba mientras escribes (cada error con su línea);
  • una vista previa del asistente se actualiza al lado;
  • subes las imágenes, la licencia y los archivos pequeños del paquete.

Al publicarlo, el instalador recibe su página de descarga y sus tres enlaces, uno por sistema. Mientras no esté publicado, solo tú puedes probarlo.

2. En las releases de GitHub, sin servidor

El paquete (install.yaml y sus archivos) y sus instaladores se adjuntan a cada release de tu repositorio. Los instaladores leen la última release, así que no hay nada que cambiar de una versión a otra. Un workflow lo hace en cada release:

# .github/workflows/installer.yml
on:
  release:
    types: [published]
jobs:
  installer:
    uses: davidnurdin/jumphp2installer/.github/workflows/package.yml@main
    with:
      folder: installer        # install.yaml y sus archivos
    permissions:
      contents: write

También puedes hacerlo a mano, desde un clon de jumphp2installer: tools/github-release.sh yo/mi-app installer. Tus enlaces: https://github.com/yo/mi-app/releases/latest/download/Mi-App-setup.exe.

Si tu repositorio publica varios productos (tags v* para uno, ide-v* para otro), la «última release» puede ser del otro producto. En ese caso, sirve el paquete desde los archivos del repositorio (https://raw.githubusercontent.com/…/installer/), con un version.json al lado. Es lo que hace JumPHP IDE.

3. En tu propio servidor

El servidor de jumphp2installer es una app Symfony + MariaDB, en Docker (server/ del repositorio): cuentas, editor, vista previa, páginas de descarga y estadísticas. Basta un docker compose up -d para arrancarlo. Una simple página web estática también puede servir de servidor (una carpeta con install.yaml y sus archivos):

php tools/package-release.php mi-paquete/ https://mi-sitio.es/instalador/ bases/ salida/

Para un juego o una app JumPHP

bin/jumphp app:export mi-app --windows --macos (o export:standalone para un juego) produce un ejecutable por sistema. Adjúntalos a una release y usa el ejemplo jumphp-app.yaml. Tu Claude sabe hacerlo: pídele «haz un instalador de mi juego» (el repositorio incluye un skill jumphp2installer).

Por línea de comandos

Mi-App-setup-linux-x86_64 --silent --folder=/opt/mi-app --no-option=desktop
Mi-App-setup.exe --silent
"C:\…\Mi App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml      # comprobar un script
jumphp2installer-linux-x86_64 --script=install.yaml              # probar el asistente con un script local
jumphp2installer-linux-x86_64 --make=Mi-App-setup.exe --server=github:yo/mi-app --from=jumphp2installer-windows-x86_64.exe

Cómo funciona

El instalador es a su vez una app JumPHP: una página HTML para el asistente, PHP para el trabajo y el PHP autónomo de StaticPHP. La dirección del paquete se escribe en el php.ini integrado del ejecutable, con un tamaño constante. Así, un servidor puede crear un instalador por paquete en una fracción de segundo, sin compilar nada. Las descargas y la extracción avanzan un poco en cada fotograma: la ventana nunca se congela. Antes de cada versión, GitHub Actions prueba el instalador de verdad en Linux, Windows y dos Mac (Apple silicon e Intel): instalación, accesos directos, entrada de desinstalación y después desinstalación.

Límites

  • Los instaladores no están firmados: Windows SmartScreen y macOS Gatekeeper avisan la primera vez (en Mac: clic derecho › Abrir).
  • Instalación solo para el usuario (sin Program Files, servicios ni asociaciones de archivos).
  • Sin Linux ARM ni teléfonos.
  • En Windows, hay que iniciarlo por su ruta larga, nunca por un nombre corto 8.3 (C:\Users\RUNNER~1\…).