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.





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:
--silentinstalla 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\…).