UK

jumphp2installer: інсталятор для вашої програми

jumphp2installer створює справжні нативні інсталятори для Windows, macOS і Linux — для вашої гри, застосунку JumPHP або будь-якої програми. Ви пишете короткий зрозумілий скрипт YAML, а користувачі завантажують один файл. Він показує майстер встановлення (вітання, ліцензія, тека, параметри), завжди встановлює останню версію і додає деінсталятор. Це вільне ПЗ з відкритим кодом: github.com/davidnurdin/jumphp2installer.

Сторінка вітання майстра встановлення
Вітання
Ліцензія, яку треба прийняти
Ліцензія
Вибір теки встановлення
Тека
Параметри: ярлики
Параметри
Завершення встановлення
Готово

Що він робить

  • Один файл на систему: My-App-setup.exe (Windows 10 і 11), My-App-setup-macos.zip (Mac на Apple silicon та Intel), My-App-setup-linux-x86_64. Заздалегідь нічого встановлювати не треба.
  • Завжди остання версія: інсталятор читає ваш скрипт під час запуску. Інсталятор, завантажений рік тому, встановить сьогоднішню версію.
  • Майстер у ваших кольорах: ваша назва, піктограма, зображення збоку, колір, ліцензія й тексти. Англійською або французькою — залежно від мови комп'ютера.
  • Звичайні кроки: завантажити (з перевіркою SHA-256), розпакувати (.zip, .tar.gz), скопіювати, записати файл, зробити виконуваним, виконати команду, створити ярлики (робочий стіл, меню).
  • Справжній деінсталятор: він видно в «Застосунках» Windows і в меню Linux. Він видаляє рівно те, що створило встановлення, і нічого більше.
  • Без прав адміністратора: усе встановлюється для користувача, у його власну теку програм.
  • І з командного рядка: --silent встановлює без вікна (розгортання, скрипти, CI).

Скрипт встановлення

Файл install.yaml описує, що інсталятор показує (pages) і що робить (steps). Той самий скрипт працює на трьох системах: змінні ({folder}, {platform}, {exe}…) і ключ os: враховують відмінності.

app:
  name: Мій застосунок
  publisher: Я
  website: https://example.ua
  icon: icon.png
  banner: banner.png          # зображення ліворуч у майстрі (172 x 420)
  accent: "#2f6fed"

version:
  github: me/my-app           # останній реліз на GitHub дає {version}

pages:
  - welcome
  - license: LICENSE.txt
  - folder: "{programs}/{app}"
  - options:
      desktop: Ярлик на робочому столі
  - install
  - finish: {run: "{folder}/my-app{exe}"}

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

Сторінки

Сторінка Що показує
welcome текст вітання (типово: «Ласкаво просимо до встановлення {app} {version}»)
license файл пакета, який треба прийняти, щоб продовжити
folder теку, з кнопкою «Огляд…», потрібним і вільним місцем; попереджає, якщо тека вже зайнята
options прапорці, які потім використовують кроки (if: desktop)
install індикатор поступу й подробиці
finish кінець, з прапорцем «Запустити {app}» (run, може залежати від системи)

Кроки

Крок
download адреса або файл пакета; sha256 зупиняє все, якщо файл не той
extract розпаковує в {folder}; strip: 1 прибирає верхню теку архіву
copy, mkdir, write, delete файли й теки (delete торкається лише теки встановлення, теки користувача та тимчасової теки)
executable робить файл виконуваним (Linux, macOS)
shortcut desktop, menu або both: .lnk у Windows, .desktop у Linux, посилання в macOS
run виконує команду в теці
uninstaller встановлює деінсталятор і реєструє його в системі

Кожен крок приймає if: (позначений параметр або "!параметр"), os: (windows, macos, linux) і label:.

Версія

Запис {version}
version: 1.4.0 фіксована
version: {github: me/my-app} останній реліз репозиторію (його тег без v)
version: {latest: https://…/latest.json} те, що відповідає адреса: {"version": "1.4.0"} або текст

Змінні

Змінна Windows Linux macOS
{programs} %LOCALAPPDATA%\Programs ~/.local/opt ~/Applications
{desktop}, {menu} робочий стіл, меню «Пуск» робочий стіл, ~/.local/share/applications ~/Desktop
{platform} windows-x86_64 linux-x86_64 macos-arm64 / macos-x86_64
{exe} .exe (порожньо) (порожньо)
{folder}, {app}, {version}, {home}, {temp}, {os}, {arch}, {download}

Повний довідник: docs/installer/script.md.

Три способи опублікувати

1. На jumphp.net, нічого не встановлюючи

У студії кнопка «Новий інсталятор» відкриває редактор:

  • скрипт YAML перевіряється під час введення (кожна помилка з номером рядка);
  • поруч оновлюється попередній перегляд майстра;
  • ви завантажуєте зображення, ліцензію та невеликі файли пакета.

Після публікації інсталятор отримує свою сторінку завантаження і три посилання, по одному на систему. Доки він не опублікований, спробувати його можете лише ви.

2. У релізах GitHub, без сервера

Пакет (install.yaml і його файли) та інсталятори додаються до кожного релізу вашого репозиторію. Інсталятори читають останній реліз, тож між версіями нічого змінювати не треба. Workflow робить це під час кожного релізу:

# .github/workflows/installer.yml
on:
  release:
    types: [published]
jobs:
  installer:
    uses: davidnurdin/jumphp2installer/.github/workflows/package.yml@main
    with:
      folder: installer        # install.yaml і його файли
    permissions:
      contents: write

Можна й вручну, з клону jumphp2installer: tools/github-release.sh me/my-app installer. Ваші посилання: https://github.com/me/my-app/releases/latest/download/My-App-setup.exe.

Якщо репозиторій випускає кілька продуктів (теги v* для одного, ide-v* для іншого), «останній реліз» може належати іншому продукту. Тоді віддавайте пакет із файлів репозиторію (https://raw.githubusercontent.com/…/installer/), з файлом version.json поруч. Так робить JumPHP IDE.

3. На власному сервері

Сервер jumphp2installer — це застосунок Symfony + MariaDB у Docker (server/ у репозиторії): облікові записи, редактор, попередній перегляд, сторінки завантаження і статистика. Запускається однією командою docker compose up -d. Сервером може бути й проста статична вебсторінка (тека з install.yaml та його файлами):

php tools/package-release.php my-package/ https://my-site.ua/installer/ bases/ out/

Для гри або застосунку JumPHP

bin/jumphp app:export my-app --windows --macos (або export:standalone для гри) створює по виконуваному файлу на систему. Додайте їх до релізу й використайте приклад jumphp-app.yaml. Ваш Claude це вміє: попросіть його «зроби інсталятор для моєї гри» (у репозиторії є skill jumphp2installer).

З командного рядка

My-App-setup-linux-x86_64 --silent --folder=/opt/my-app --no-option=desktop
My-App-setup.exe --silent
"C:\…\My App\uninstall.exe" --uninstall --silent
jumphp2installer-linux-x86_64 --check --script=install.yaml      # перевірити скрипт
jumphp2installer-linux-x86_64 --script=install.yaml              # спробувати майстер з локальним скриптом
jumphp2installer-linux-x86_64 --make=My-App-setup.exe --server=github:me/my-app --from=jumphp2installer-windows-x86_64.exe

Як це працює

Інсталятор і сам є застосунком JumPHP: HTML-сторінка для майстра, PHP для роботи та автономний PHP від StaticPHP. Адреса пакета записується у вбудований php.ini виконуваного файлу, без зміни його розміру. Тому сервер за частку секунди робить інсталятор для будь-якого пакета, нічого не компілюючи. Завантаження й розпакування просуваються потроху в кожному кадрі: вікно ніколи не зависає. Перед кожною версією GitHub Actions по-справжньому перевіряє інсталятор на Linux, Windows і двох Mac (Apple silicon та Intel): встановлення, ярлики, запис для видалення, потім видалення.

Обмеження

  • Інсталятори не підписані: Windows SmartScreen і macOS Gatekeeper попереджають під час першого запуску (на Mac: правий клік › Відкрити).
  • Встановлення лише для користувача (без Program Files, служб і асоціацій файлів).
  • Немає Linux ARM і телефонів.
  • У Windows запускайте його за довгим шляхом, ніколи за коротким іменем 8.3 (C:\Users\RUNNER~1\…).