FR

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.

La page de bienvenue de l'assistant d'installation
Bienvenue
La licence à accepter
Licence
Le choix du dossier d'installation
Dossier
Les options : raccourcis
Options
La fin de l'installation
Terminé

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