IT

jumphp2installer: un installer per il tuo software

jumphp2installer crea veri installer nativi per Windows, macOS e Linux, per il tuo gioco, la tua app JumPHP o qualsiasi software. Scrivi un breve script YAML leggibile, e i tuoi utenti scaricano un solo file. Mostra loro una procedura guidata (benvenuto, licenza, cartella, opzioni), installa sempre l'ultima versione e aggiunge un programma di disinstallazione. È libero e open source: github.com/davidnurdin/jumphp2installer.

La pagina di benvenuto della procedura di installazione
Benvenuto
La licenza da accettare
Licenza
La scelta della cartella di installazione
Cartella
Le opzioni: collegamenti
Opzioni
La fine dell'installazione
Fatto

Cosa fa

  • Un file per sistema: Mia-App-setup.exe (Windows 10 e 11), Mia-App-setup-macos.zip (Mac Apple silicon e Intel), Mia-App-setup-linux-x86_64. Niente da installare prima.
  • Sempre l'ultima versione: l'installer legge il tuo script all'avvio. Un installer scaricato un anno fa installa quindi la versione di oggi.
  • Una procedura con i tuoi colori: il tuo nome, la tua icona, la tua immagine laterale, il tuo colore, la tua licenza e i tuoi testi. In inglese o in francese, secondo la lingua del computer.
  • I passi abituali: scaricare (con controllo SHA-256), estrarre (.zip, .tar.gz), copiare, scrivere un file, rendere eseguibile, lanciare un comando, creare collegamenti (desktop, menu).
  • Un vero programma di disinstallazione: compare in «App» di Windows e nel menu di Linux. Rimuove esattamente ciò che l'installazione ha creato, nient'altro.
  • Senza diritti di amministratore: tutto si installa per l'utente, nella sua cartella dei programmi.
  • Anche da riga di comando: --silent installa senza finestra (distribuzioni, script, CI).

Lo script di installazione

Un file install.yaml dice cosa l'installer mostra (pages) e cosa fa (steps). Lo stesso script funziona sui tre sistemi: le variabili ({folder}, {platform}, {exe}…) e la chiave os: gestiscono le differenze.

app:
  name: Mia App
  publisher: Io
  website: https://esempio.it
  icon: icon.png
  banner: banner.png          # l'immagine a sinistra della procedura (172 x 420)
  accent: "#2f6fed"

version:
  github: io/mia-app          # l'ultima release GitHub dà {version}

pages:
  - welcome
  - license: LICENSE.txt
  - folder: "{programs}/{app}"
  - options:
      desktop: Un collegamento sul desktop
  - install
  - finish: {run: "{folder}/mia-app{exe}"}

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

Le pagine

Pagina Cosa mostra
welcome un testo di benvenuto (predefinito: «Benvenuto nell'installazione di {app} {version}»)
license un file del pacchetto, da accettare per proseguire
folder la cartella, con «Sfoglia…», lo spazio necessario e quello libero; avvisa se la cartella è già usata
options caselle da spuntare, riutilizzate dai passi (if: desktop)
install la barra di avanzamento e i dettagli
finish la fine, con una casella «Avvia {app}» (run, che può cambiare secondo il sistema)

I passi

Passo
download un indirizzo o un file del pacchetto; sha256 ferma tutto se il file non è quello giusto
extract estrae in {folder}; strip: 1 toglie la cartella principale dell'archivio
copy, mkdir, write, delete file e cartelle (delete tocca solo la cartella di installazione, quella dell'utente e quella temporanea)
executable rende eseguibile un file (Linux, macOS)
shortcut desktop, menu o both: .lnk su Windows, .desktop su Linux, un link su macOS
run lancia un comando nella cartella
uninstaller installa il programma di disinstallazione e lo registra nel sistema

Ogni passo accetta if: (un'opzione spuntata, o "!opzione"), os: (windows, macos, linux) e label:.

La versione

Scrittura {version}
version: 1.4.0 fissa
version: {github: io/mia-app} l'ultima release del repository (il suo tag, senza la v)
version: {latest: https://…/latest.json} ciò che risponde l'indirizzo: {"version": "1.4.0"} o testo

Le variabili

Variabile Windows Linux macOS
{programs} %LOCALAPPDATA%\Programs ~/.local/opt ~/Applications
{desktop}, {menu} desktop, menu Start desktop, ~/.local/share/applications ~/Desktop
{platform} windows-x86_64 linux-x86_64 macos-arm64 / macos-x86_64
{exe} .exe (vuoto) (vuoto)
{folder}, {app}, {version}, {home}, {temp}, {os}, {arch}, {download}

Il riferimento completo è in docs/installer/script.md.

Tre modi per pubblicarlo

1. Su jumphp.net, senza installare nulla

Nello studio, «Nuovo installer» apre un editor:

  • lo script YAML viene controllato mentre scrivi (ogni errore con la sua riga);
  • un'anteprima della procedura si aggiorna accanto;
  • carichi le immagini, la licenza e i piccoli file del pacchetto.

Quando lo pubblichi, l'installer riceve la sua pagina di download e i suoi tre link, uno per sistema. Finché non è pubblicato, solo tu puoi provarlo.

2. Nelle release GitHub, senza server

Il pacchetto (install.yaml e i suoi file) e i suoi installer vengono allegati a ogni release del tuo repository. Gli installer leggono l'ultima release, quindi non c'è nulla da cambiare da una versione all'altra. Un workflow lo fa a ogni release:

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

Puoi anche farlo a mano, da un clone di jumphp2installer: tools/github-release.sh io/mia-app installer. I tuoi link: https://github.com/io/mia-app/releases/latest/download/Mia-App-setup.exe.

Se il tuo repository pubblica più prodotti (tag v* per uno, ide-v* per un altro), l'«ultima release» può appartenere all'altro prodotto. In tal caso, servi il pacchetto dai file del repository (https://raw.githubusercontent.com/…/installer/), con un version.json accanto. È ciò che fa JumPHP IDE.

3. Sul tuo server

Il server di jumphp2installer è un'app Symfony + MariaDB, in Docker (server/ del repository): account, editor, anteprima, pagine di download e statistiche. Basta un docker compose up -d per avviarlo. Anche una semplice pagina web statica può fare da server (una cartella con install.yaml e i suoi file):

php tools/package-release.php mio-pacchetto/ https://mio-sito.it/installer/ bases/ out/

Per un gioco o un'app JumPHP

bin/jumphp app:export mia-app --windows --macos (o export:standalone per un gioco) produce un eseguibile per sistema. Allegali a una release, poi usa l'esempio jumphp-app.yaml. Il tuo Claude sa farlo: chiedigli «fai un installer del mio gioco» (il repository contiene uno skill jumphp2installer).

Da riga di comando

Mia-App-setup-linux-x86_64 --silent --folder=/opt/mia-app --no-option=desktop
Mia-App-setup.exe --silent
"C:\…\Mia App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml      # controllare uno script
jumphp2installer-linux-x86_64 --script=install.yaml              # provare la procedura con uno script locale
jumphp2installer-linux-x86_64 --make=Mia-App-setup.exe --server=github:io/mia-app --from=jumphp2installer-windows-x86_64.exe

Come funziona

L'installer è a sua volta un'app JumPHP: una pagina HTML per la procedura, PHP per il lavoro e il PHP autonomo di StaticPHP. L'indirizzo del pacchetto è scritto nel php.ini incorporato dell'eseguibile, a dimensione costante. Un server può quindi creare un installer per ogni pacchetto in una frazione di secondo, senza compilare nulla. Download ed estrazione avanzano un po' a ogni fotogramma: la finestra non si blocca mai. Prima di ogni versione, GitHub Actions prova davvero l'installer su Linux, Windows e due Mac (Apple silicon e Intel): installazione, collegamenti, voce di disinstallazione, poi disinstallazione.

Limiti

  • Gli installer non sono firmati: Windows SmartScreen e macOS Gatekeeper avvisano la prima volta (su Mac: clic destro › Apri).
  • Installazione solo per l'utente (niente Program Files, servizi o associazioni di file).
  • Niente Linux ARM né telefoni.
  • Su Windows va avviato dal percorso lungo, mai da un nome corto 8.3 (C:\Users\RUNNER~1\…).