RU

jumphp2installer: установщик для вашей программы

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

Страница приветствия мастера установки
Приветствие
Лицензия, которую нужно принять
Лицензия
Выбор папки установки
Папка
Параметры: ярлыки
Параметры
Завершение установки
Готово

Что он делает

  • Один файл на систему: Moe-Prilozhenie-setup.exe (Windows 10 и 11), Moe-Prilozhenie-setup-macos.zip (Mac на Apple silicon и Intel), Moe-Prilozhenie-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.ru
  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.ru/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\…).