jumphp2installer : un installeur pour votre logiciel
jumphp2installer fabrique de vrais installeurs natifs pour Windows, macOS et Linux, pour votre jeu, votre application JumPHP ou n'importe quel logiciel. Vous écrivez un petit script YAML lisible, et vos utilisateurs téléchargent un seul fichier. Celui-ci leur montre un assistant (bienvenue, licence, dossier, options), installe toujours la dernière version et ajoute un désinstalleur. C'est libre et open source : github.com/davidnurdin/jumphp2installer.





Ce qu'il fait
- Un fichier par système :
Mon-Appli-setup.exe(Windows 10 et 11),Mon-Appli-setup-macos.zip(Mac Apple silicon et Intel),Mon-Appli-setup-linux-x86_64. Rien à installer avant. - Toujours la dernière version : l'installeur lit votre script au moment où il démarre. Un installeur téléchargé il y a un an installe donc la version d'aujourd'hui.
- Un assistant à vos couleurs : votre nom, votre icône, votre image sur le côté, votre couleur, votre licence et vos textes. En anglais ou en français, selon la langue de l'ordinateur.
- Les étapes courantes : télécharger (avec vérification SHA-256), décompresser (
.zip,.tar.gz), copier, écrire un fichier, rendre exécutable, lancer une commande, créer des raccourcis (bureau, menu). - Un vrai désinstalleur : il apparaît dans « Applications » de Windows et dans le menu sous Linux. Il retire exactement ce que l'installation a créé, et rien d'autre.
- Sans droits administrateur : tout s'installe pour l'utilisateur, dans son propre dossier de programmes.
- En ligne de commande aussi :
--silentinstalle sans fenêtre (déploiements, scripts, CI).
Le script d'installation
Un fichier install.yaml dit ce que l'installeur montre (pages) et ce qu'il fait (steps). Le même
script sert sur les trois systèmes : les variables ({folder}, {platform}, {exe}…) et la clé os: gèrent les
différences.
app:
name: Mon Appli
publisher: Moi
website: https://exemple.fr
icon: icon.png
banner: banner.png # l'image à gauche de l'assistant (172 x 420)
accent: "#2f6fed"
version:
github: moi/mon-appli # la dernière release GitHub donne {version}
pages:
- welcome
- license: LICENSE.txt
- folder: "{programs}/{app}"
- options:
desktop: Un raccourci sur le bureau
- install
- finish: {run: "{folder}/mon-appli{exe}"}
steps:
- download: https://github.com/moi/mon-appli/releases/download/v{version}/mon-appli-{platform}.zip
- extract: {strip: 1}
- executable: "{folder}/mon-appli"
os: [linux, macos]
- shortcut: {target: "{folder}/mon-appli{exe}", where: desktop}
if: desktop
- uninstaller
Les pages
| Page | Ce qu'elle montre |
|---|---|
welcome |
un texte d'accueil (par défaut : « Bienvenue dans l'installation de {app} {version} ») |
license |
un fichier du paquet, à accepter pour continuer |
folder |
le dossier, avec « Parcourir… », la place nécessaire et la place libre ; prévient si le dossier est déjà utilisé |
options |
des cases à cocher, réutilisées par les étapes (if: desktop) |
install |
la barre de progression et le détail |
finish |
la fin, avec une case « Lancer {app} » (run, qui peut changer selon le système) |
Les étapes
| Étape | |
|---|---|
download |
une adresse, ou un fichier du paquet ; sha256 arrête tout si le fichier n'est pas le bon |
extract |
décompresse dans {folder} ; strip: 1 retire le dossier racine de l'archive |
copy, mkdir, write, delete |
fichiers et dossiers (delete ne touche qu'au dossier d'installation, au dossier de l'utilisateur et au dossier temporaire) |
executable |
rend un fichier exécutable (Linux, macOS) |
shortcut |
desktop, menu ou both : .lnk sous Windows, .desktop sous Linux, un lien sous macOS |
run |
lance une commande dans le dossier |
uninstaller |
installe le désinstalleur et l'inscrit auprès du système |
Chaque étape accepte if: (une option cochée, ou "!option"), os: (windows, macos, linux) et label:.
La version
| Écriture | {version} |
|---|---|
version: 1.4.0 |
fixe |
version: {github: moi/mon-appli} |
la dernière release du dépôt (son tag, sans le v) |
version: {latest: https://…/latest.json} |
ce que répond l'adresse : {"version": "1.4.0"} ou du texte |
Les variables
| Variable | Windows | Linux | macOS |
|---|---|---|---|
{programs} |
%LOCALAPPDATA%\Programs |
~/.local/opt |
~/Applications |
{desktop}, {menu} |
bureau, menu Démarrer | bureau, ~/.local/share/applications |
~/Desktop |
{platform} |
windows-x86_64 |
linux-x86_64 |
macos-arm64 / macos-x86_64 |
{exe} |
.exe |
(vide) | (vide) |
{folder}, {app}, {version}, {home}, {temp}, {os}, {arch}, {download} |
La référence complète est dans docs/installer/script.md.
Trois façons de le publier
1. Sur jumphp.net, sans rien installer
Dans le studio, « Nouvel installeur » ouvre un éditeur :
- le script YAML est vérifié pendant que vous tapez (chaque erreur avec sa ligne) ;
- un aperçu de l'assistant se met à jour à côté ;
- vous déposez les images, la licence et les petits fichiers du paquet.
Quand vous publiez, l'installeur reçoit sa page de téléchargement et ses trois liens, un par système. Tant qu'il n'est pas publié, vous êtes le seul à pouvoir l'essayer.
2. Dans les releases GitHub, sans serveur
Le paquet (install.yaml et ses fichiers) et ses installeurs sont joints à chaque release de votre dépôt. Les
installeurs lisent la dernière release, donc rien à changer d'une version à l'autre. Un workflow le fait à chaque
release :
# .github/workflows/installer.yml
on:
release:
types: [published]
jobs:
installer:
uses: davidnurdin/jumphp2installer/.github/workflows/package.yml@main
with:
folder: installer # install.yaml et ses fichiers
permissions:
contents: write
Vous pouvez aussi le faire à la main, depuis un clone de jumphp2installer :
tools/github-release.sh moi/mon-appli installer. Vos liens :
https://github.com/moi/mon-appli/releases/latest/download/Mon-Appli-setup.exe.
Si votre dépôt publie plusieurs produits (des tags v* pour l'un, ide-v* pour l'autre), la « dernière
release » peut appartenir à l'autre produit. Dans ce cas, servez le paquet depuis les fichiers du dépôt
(https://raw.githubusercontent.com/…/installer/), avec un version.json à côté. C'est ce que fait
JumPHP IDE.
3. Sur votre propre serveur
Le serveur de jumphp2installer est une application Symfony + MariaDB, dans Docker (server/ du dépôt) : comptes,
éditeur, aperçu, pages de téléchargement et statistiques. Un docker compose up -d suffit pour le lancer. Une
simple page web statique peut aussi servir de serveur (un dossier avec install.yaml et ses fichiers) :
php tools/package-release.php mon-paquet/ https://mon-site.fr/installeur/ bases/ sortie/
Pour un jeu ou une appli JumPHP
bin/jumphp app:export mon-appli --windows --macos (ou export:standalone pour un jeu) produit un exécutable par
système. Joignez-les à une release, puis utilisez
l'exemple jumphp-app.yaml.
Votre Claude sait le faire : demandez-lui « fais un installeur de mon jeu » (le dépôt contient un skill
jumphp2installer).
En ligne de commande
Mon-Appli-setup-linux-x86_64 --silent --folder=/opt/mon-appli --no-option=desktop
Mon-Appli-setup.exe --silent
"C:\…\Mon Appli\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml # vérifier un script
jumphp2installer-linux-x86_64 --script=install.yaml # essayer l'assistant avec un script local
jumphp2installer-linux-x86_64 --make=Mon-Appli-setup.exe --server=github:moi/mon-appli --from=jumphp2installer-windows-x86_64.exe
Comment ça marche
L'installeur est lui-même une application JumPHP : une page HTML pour l'assistant, du PHP pour le travail, et le PHP autonome de StaticPHP. L'adresse du paquet est écrite dans le php.ini embarqué de l'exécutable, à taille constante. Un serveur peut donc fabriquer un installeur pour chaque paquet en une fraction de seconde, sans rien compiler. Les téléchargements et l'extraction avancent un peu à chaque image : la fenêtre ne se fige jamais. Avant chaque version, l'installeur est essayé pour de vrai par GitHub Actions sous Linux, Windows et deux Mac (Apple silicon et Intel) : installation, raccourcis, entrée de désinstallation, puis désinstallation.
Limites
- Les installeurs ne sont pas signés : Windows SmartScreen et macOS Gatekeeper préviennent la première fois (sur Mac : clic droit › Ouvrir).
- Installation pour l'utilisateur seulement (pas de Program Files, de services ni d'associations de fichiers).
- Pas de Linux ARM ni de téléphones.
- Sous Windows, il faut le lancer par son chemin long, jamais par un nom court 8.3 (
C:\Users\RUNNER~1\…).