DE

jumphp2installer: ein Installationsprogramm für Ihre Software

jumphp2installer erstellt echte native Installationsprogramme für Windows, macOS und Linux, für Ihr Spiel, Ihre JumPHP-App oder beliebige Software. Sie schreiben ein kurzes, lesbares YAML-Skript, und Ihre Nutzer laden eine einzige Datei herunter. Sie zeigt einen Assistenten (Willkommen, Lizenz, Ordner, Optionen), installiert immer die neueste Version und richtet ein Deinstallationsprogramm ein. Frei und quelloffen: github.com/davidnurdin/jumphp2installer.

Die Willkommensseite des Installationsassistenten
Willkommen
Die Lizenz, die akzeptiert werden muss
Lizenz
Die Wahl des Installationsordners
Ordner
Die Optionen: Verknüpfungen
Optionen
Das Ende der Installation
Fertig

Was es kann

  • Eine Datei pro System: Meine-App-setup.exe (Windows 10 und 11), Meine-App-setup-macos.zip (Macs mit Apple Silicon und Intel), Meine-App-setup-linux-x86_64. Vorher muss nichts installiert werden.
  • Immer die neueste Version: Das Programm liest Ihr Skript beim Start. Ein vor einem Jahr heruntergeladenes Installationsprogramm installiert also die Version von heute.
  • Ein Assistent in Ihren Farben: Ihr Name, Ihr Symbol, Ihr Bild an der Seite, Ihre Farbe, Ihre Lizenz und Ihre Texte. Auf Englisch oder Französisch, je nach Sprache des Computers.
  • Die üblichen Schritte: herunterladen (mit SHA-256-Prüfung), entpacken (.zip, .tar.gz), kopieren, eine Datei schreiben, ausführbar machen, einen Befehl starten, Verknüpfungen anlegen (Desktop, Menü).
  • Ein echtes Deinstallationsprogramm: Es erscheint unter „Apps“ in Windows und im Linux-Menü. Es entfernt genau das, was die Installation angelegt hat, und sonst nichts.
  • Ohne Administratorrechte: Alles wird für den Nutzer installiert, in seinen eigenen Programmordner.
  • Auch auf der Kommandozeile: --silent installiert ohne Fenster (Verteilung, Skripte, CI).

Das Installationsskript

Eine Datei install.yaml legt fest, was das Programm zeigt (pages) und was es tut (steps). Dasselbe Skript funktioniert auf allen drei Systemen: Variablen ({folder}, {platform}, {exe}…) und der Schlüssel os: kümmern sich um die Unterschiede.

app:
  name: Meine App
  publisher: Ich
  website: https://beispiel.de
  icon: icon.png
  banner: banner.png          # das Bild links im Assistenten (172 x 420)
  accent: "#2f6fed"

version:
  github: ich/meine-app       # das neueste GitHub-Release liefert {version}

pages:
  - welcome
  - license: LICENSE.txt
  - folder: "{programs}/{app}"
  - options:
      desktop: Eine Verknüpfung auf dem Desktop
  - install
  - finish: {run: "{folder}/meine-app{exe}"}

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

Die Seiten

Seite Was sie zeigt
welcome einen Begrüßungstext (Standard: „Willkommen bei der Installation von {app} {version}“)
license eine Datei des Pakets, die vor dem Weitergehen akzeptiert werden muss
folder den Ordner, mit „Durchsuchen…“, dem benötigten und dem freien Platz; warnt, wenn der Ordner schon belegt ist
options Kontrollkästchen, die die Schritte wieder verwenden (if: desktop)
install den Fortschrittsbalken und die Details
finish das Ende, mit einem Kästchen „{app} starten“ (run, je nach System verschieden möglich)

Die Schritte

Schritt
download eine Adresse oder eine Datei des Pakets; sha256 bricht ab, wenn die Datei nicht die richtige ist
extract entpackt nach {folder}; strip: 1 entfernt den obersten Ordner des Archivs
copy, mkdir, write, delete Dateien und Ordner (delete betrifft nur den Installationsordner, den Ordner des Nutzers und den temporären Ordner)
executable macht eine Datei ausführbar (Linux, macOS)
shortcut desktop, menu oder both: .lnk unter Windows, .desktop unter Linux, ein Link unter macOS
run startet einen Befehl im Ordner
uninstaller installiert das Deinstallationsprogramm und meldet es beim System an

Jeder Schritt kennt if: (eine angekreuzte Option oder "!option"), os: (windows, macos, linux) und label:.

Die Version

Schreibweise {version}
version: 1.4.0 fest
version: {github: ich/meine-app} das neueste Release des Repositorys (sein Tag, ohne das v)
version: {latest: https://…/latest.json} was die Adresse antwortet: {"version": "1.4.0"} oder Text

Die Variablen

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

Die vollständige Referenz steht in docs/installer/script.md.

Drei Wege zur Veröffentlichung

1. Auf jumphp.net, ohne etwas zu installieren

Im Studio öffnet „Neues Installationsprogramm“ einen Editor:

  • das YAML-Skript wird beim Tippen geprüft (jeder Fehler mit seiner Zeile);
  • eine Vorschau des Assistenten aktualisiert sich daneben;
  • Sie legen die Bilder, die Lizenz und die kleinen Dateien des Pakets ab.

Beim Veröffentlichen erhält das Installationsprogramm seine Download-Seite und seine drei Links, einen pro System. Solange es nicht veröffentlicht ist, können nur Sie es ausprobieren.

2. In GitHub-Releases, ohne Server

Das Paket (install.yaml und seine Dateien) und seine Installationsprogramme werden an jedes Release Ihres Repositorys angehängt. Die Programme lesen das neueste Release, von Version zu Version ist also nichts zu ändern. Ein Workflow erledigt das bei jedem Release:

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

Oder von Hand, aus einem Klon von jumphp2installer: tools/github-release.sh ich/meine-app installer. Ihre Links: https://github.com/ich/meine-app/releases/latest/download/Meine-App-setup.exe.

Veröffentlicht Ihr Repository mehrere Produkte (Tags v* für eines, ide-v* für ein anderes), kann das „neueste Release“ zum anderen Produkt gehören. Stellen Sie das Paket dann aus den Dateien des Repositorys bereit (https://raw.githubusercontent.com/…/installer/), mit einer version.json daneben. So macht es JumPHP IDE.

3. Auf Ihrem eigenen Server

Der Server von jumphp2installer ist eine Symfony- und MariaDB-App in Docker (server/ im Repository): Konten, Editor, Vorschau, Download-Seiten und Statistiken. Ein docker compose up -d startet ihn. Auch eine einfache statische Webseite kann als Server dienen (ein Ordner mit install.yaml und seinen Dateien):

php tools/package-release.php mein-paket/ https://meine-seite.de/installer/ bases/ out/

Für ein JumPHP-Spiel oder eine JumPHP-App

bin/jumphp app:export meine-app --windows --macos (oder export:standalone für ein Spiel) erzeugt eine ausführbare Datei pro System. Hängen Sie sie an ein Release an und nutzen Sie das Beispiel jumphp-app.yaml. Ihr Claude kann das: Bitten Sie ihn „mach ein Installationsprogramm für mein Spiel“ (das Repository enthält einen Skill jumphp2installer).

Auf der Kommandozeile

Meine-App-setup-linux-x86_64 --silent --folder=/opt/meine-app --no-option=desktop
Meine-App-setup.exe --silent
"C:\…\Meine App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml      # ein Skript prüfen
jumphp2installer-linux-x86_64 --script=install.yaml              # den Assistenten mit einem lokalen Skript ausprobieren
jumphp2installer-linux-x86_64 --make=Meine-App-setup.exe --server=github:ich/meine-app --from=jumphp2installer-windows-x86_64.exe

Wie es funktioniert

Das Installationsprogramm ist selbst eine JumPHP-App: eine HTML-Seite für den Assistenten, PHP für die Arbeit und das eigenständige PHP von StaticPHP. Die Adresse des Pakets wird in die eingebettete php.ini der ausführbaren Datei geschrieben, mit gleichbleibender Größe. Ein Server erstellt so für jedes Paket in Sekundenbruchteilen ein Installationsprogramm, ohne etwas zu kompilieren. Downloads und Entpacken laufen in jedem Frame ein Stück weiter: Das Fenster friert nie ein. Vor jeder Version probiert GitHub Actions das Programm echt unter Linux, Windows und auf zwei Macs (Apple Silicon und Intel) aus: Installation, Verknüpfungen, Deinstallationseintrag, dann Deinstallation.

Grenzen

  • Die Installationsprogramme sind nicht signiert: Windows SmartScreen und macOS Gatekeeper warnen beim ersten Mal (auf dem Mac: Rechtsklick › Öffnen).
  • Nur Installation für den Nutzer (kein Program Files, keine Dienste, keine Dateizuordnungen).
  • Kein Linux ARM, keine Telefone.
  • Unter Windows über den langen Pfad starten, nie über einen kurzen 8.3-Namen (C:\Users\RUNNER~1\…).