NL

jumphp2installer: een installatieprogramma voor je software

jumphp2installer maakt echte native installatieprogramma's voor Windows, macOS en Linux, voor je game, je JumPHP-app of welke software dan ook. Je schrijft een kort, leesbaar YAML-script, en je gebruikers downloaden één bestand. Dat toont een wizard (welkom, licentie, map, opties), installeert altijd de nieuwste versie en voegt een verwijderprogramma toe. Het is vrij en open source: github.com/davidnurdin/jumphp2installer.

De welkomstpagina van de installatiewizard
Welkom
De licentie om te accepteren
Licentie
De keuze van de installatiemap
Map
De opties: snelkoppelingen
Opties
Het einde van de installatie
Klaar

Wat het doet

  • Eén bestand per systeem: Mijn-App-setup.exe (Windows 10 en 11), Mijn-App-setup-macos.zip (Macs met Apple silicon en Intel), Mijn-App-setup-linux-x86_64. Vooraf niets te installeren.
  • Altijd de nieuwste versie: het programma leest je script bij het starten. Een installatieprogramma dat een jaar geleden is gedownload, installeert dus de versie van vandaag.
  • Een wizard in jouw kleuren: je naam, je pictogram, je afbeelding aan de zijkant, je kleur, je licentie en je teksten. In het Engels of het Frans, volgens de taal van de computer.
  • De gebruikelijke stappen: downloaden (met SHA-256-controle), uitpakken (.zip, .tar.gz), kopiëren, een bestand schrijven, uitvoerbaar maken, een opdracht starten, snelkoppelingen maken (bureaublad, menu).
  • Een echt verwijderprogramma: het verschijnt onder "Apps" in Windows en in het Linux-menu. Het verwijdert precies wat de installatie heeft gemaakt, niets anders.
  • Zonder beheerdersrechten: alles wordt voor de gebruiker geïnstalleerd, in diens eigen programmamap.
  • Ook via de opdrachtregel: --silent installeert zonder venster (uitrol, scripts, CI).

Het installatiescript

Een bestand install.yaml zegt wat het programma toont (pages) en wat het doet (steps). Hetzelfde script werkt op alle drie de systemen: variabelen ({folder}, {platform}, {exe}…) en de sleutel os: regelen de verschillen.

app:
  name: Mijn App
  publisher: Ik
  website: https://voorbeeld.nl
  icon: icon.png
  banner: banner.png          # de afbeelding links in de wizard (172 x 420)
  accent: "#2f6fed"

version:
  github: ik/mijn-app         # de nieuwste GitHub-release geeft {version}

pages:
  - welcome
  - license: LICENSE.txt
  - folder: "{programs}/{app}"
  - options:
      desktop: Een snelkoppeling op het bureaublad
  - install
  - finish: {run: "{folder}/mijn-app{exe}"}

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

De pagina's

Pagina Wat ze toont
welcome een welkomsttekst (standaard: "Welkom bij de installatie van {app} {version}")
license een bestand van het pakket, te accepteren om verder te gaan
folder de map, met "Bladeren…", de benodigde en de vrije ruimte; waarschuwt als de map al in gebruik is
options selectievakjes, opnieuw gebruikt door de stappen (if: desktop)
install de voortgangsbalk en de details
finish het einde, met een vakje "{app} starten" (run, dat per systeem kan verschillen)

De stappen

Stap
download een adres of een bestand van het pakket; sha256 stopt alles als het bestand niet het juiste is
extract pakt uit in {folder}; strip: 1 laat de bovenste map van het archief weg
copy, mkdir, write, delete bestanden en mappen (delete raakt alleen de installatiemap, de map van de gebruiker en de tijdelijke map)
executable maakt een bestand uitvoerbaar (Linux, macOS)
shortcut desktop, menu of both: .lnk op Windows, .desktop op Linux, een link op macOS
run start een opdracht in de map
uninstaller installeert het verwijderprogramma en meldt het aan bij het systeem

Elke stap kent if: (een aangevinkte optie, of "!optie"), os: (windows, macos, linux) en label:.

De versie

Schrijfwijze {version}
version: 1.4.0 vast
version: {github: ik/mijn-app} de nieuwste release van de repository (de tag, zonder de v)
version: {latest: https://…/latest.json} wat het adres antwoordt: {"version": "1.4.0"} of tekst

De variabelen

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

De volledige referentie staat in docs/installer/script.md.

Drie manieren om het te publiceren

1. Op jumphp.net, zonder iets te installeren

In de studio opent "Nieuw installatieprogramma" een editor:

  • het YAML-script wordt gecontroleerd terwijl je typt (elke fout met zijn regel);
  • een voorbeeld van de wizard wordt ernaast bijgewerkt;
  • je zet de afbeeldingen, de licentie en de kleine bestanden van het pakket erin.

Bij het publiceren krijgt het installatieprogramma zijn downloadpagina en zijn drie links, één per systeem. Zolang het niet gepubliceerd is, kun alleen jij het uitproberen.

2. In GitHub-releases, zonder server

Het pakket (install.yaml en zijn bestanden) en de installatieprogramma's worden bij elke release van je repository gevoegd. De programma's lezen de nieuwste release, dus van versie tot versie hoeft er niets te veranderen. Een workflow doet het bij elke release:

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

Je kunt het ook met de hand doen, vanuit een kloon van jumphp2installer: tools/github-release.sh ik/mijn-app installer. Je links: https://github.com/ik/mijn-app/releases/latest/download/Mijn-App-setup.exe.

Publiceert je repository meerdere producten (tags v* voor het ene, ide-v* voor het andere), dan kan de "nieuwste release" bij het andere product horen. Bied het pakket dan aan vanuit de bestanden van de repository (https://raw.githubusercontent.com/…/installer/), met een version.json ernaast. Zo doet JumPHP IDE het.

3. Op je eigen server

De server van jumphp2installer is een Symfony- en MariaDB-app in Docker (server/ in de repository): accounts, editor, voorbeeld, downloadpagina's en statistieken. Eén docker compose up -d start hem. Een eenvoudige statische webpagina kan ook als server dienen (een map met install.yaml en zijn bestanden):

php tools/package-release.php mijn-pakket/ https://mijn-site.nl/installer/ bases/ out/

Voor een JumPHP-game of -app

bin/jumphp app:export mijn-app --windows --macos (of export:standalone voor een game) maakt één uitvoerbaar bestand per systeem. Voeg ze toe aan een release en gebruik het voorbeeld jumphp-app.yaml. Je Claude kan het: vraag hem "maak een installatieprogramma voor mijn game" (de repository bevat een skill jumphp2installer).

Via de opdrachtregel

Mijn-App-setup-linux-x86_64 --silent --folder=/opt/mijn-app --no-option=desktop
Mijn-App-setup.exe --silent
"C:\…\Mijn App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml      # een script controleren
jumphp2installer-linux-x86_64 --script=install.yaml              # de wizard uitproberen met een lokaal script
jumphp2installer-linux-x86_64 --make=Mijn-App-setup.exe --server=github:ik/mijn-app --from=jumphp2installer-windows-x86_64.exe

Hoe het werkt

Het installatieprogramma is zelf een JumPHP-app: een HTML-pagina voor de wizard, PHP voor het werk en de zelfstandige PHP van StaticPHP. Het adres van het pakket wordt in de ingebouwde php.ini van het uitvoerbare bestand geschreven, met een vaste grootte. Een server maakt zo voor elk pakket in een fractie van een seconde een installatieprogramma, zonder iets te compileren. Downloaden en uitpakken gaan elk frame een stukje verder: het venster bevriest nooit. Vóór elke versie probeert GitHub Actions het programma echt uit op Linux, Windows en twee Macs (Apple silicon en Intel): installatie, snelkoppelingen, verwijderitem, daarna verwijdering.

Beperkingen

  • De installatieprogramma's zijn niet ondertekend: Windows SmartScreen en macOS Gatekeeper waarschuwen de eerste keer (op een Mac: rechtsklik › Open).
  • Alleen installatie voor de gebruiker (geen Program Files, services of bestandskoppelingen).
  • Geen Linux ARM, geen telefoons.
  • Start het op Windows via het lange pad, nooit via een korte 8.3-naam (C:\Users\RUNNER~1\…).