Updater – Система обновлений для проектов DevelNext
По мере созданий релизов собственного ПО многие разработчики встречаются с проблемой, когда у пользователей установлена неактуальная версия программы. Для DevelNext годных решений я ещё не видел, поэтому решил написать собственный Updater.
Т.к. я за открытое ПО, система обновлений будет завязана на репозитории GitHub (исходники открыты, каждый может переделать под себя), актуальные версии ПО будут искаться и скачиваться с releases указанного репозитория.
Принцип работы такой:
- 1. Рядом с исполнительным файлом приложения лежит утилита Updater.jar, которая будет отвечать за проверку и установку новых версий.
- 2. Программа после своего старта запускает Updater.jar, передаёт ему текущую версию и ждёт от него ответа (в фоновом потоке конечно же).
- 3. Updater проверяет в релизах репозитория github актуальную версию.
- 4. Если новых версий не найдено – updater закрывается, программа продолжает работу, пользователь никаких лишних сообщений не видит.
- 5. Если же найдена новая версия, updater спрашивает у пользователя разрешение (без ведома пользователя качать обновы не хорошо), получив добро, закрывает приложение, скачивает файлы с хаба, заменяет их и обратно запускает приложение.
- Необходимо завершить работу приложения перед обновлением, чтоб updater смог обновить файлы. Для этого updater отправляет сообщение в stdout, его получает приложение и завершает работу.
Итак начинаем, необходимо скачать содержимое этого репозитория github.
Содержимое репозитория:
- Папка bundle – пакет с необходимым функционалом
- Папка project-updater – исходники проекта Updater, который отвечает за обновление программы, его необходимо собрать в Updater.jar
- Папка project-updateMe – исходники демо проекта
- Папка demo – собственно демонстрация, запускаем UpdateMe.jar
Последовательность действий:
1. Собираем пакет Updater
2. Собираем приложение Updater.jar
3. Собираем наше приложение, которое будет обновляться
4. Выкладываем обновления на GitHub
Собираем пакет
Для этого нужно перейти в папку bundle и выполнить команду:
1 |
gradlew bundle |
Для командной строки Windows:
1 2 |
cd /d path_to_bundle gradlew bundle |
Соответственно вместо path_to_bundle – полный путь к папке bundle
В папке bundle\build появится готовый пакет dn-updater-bundle.dnbundle, его нужно будет установить в DN.
Чтоб не ждать перезапуска среды, можно заново открыть проект – так выходит значительно быстрее, пакет при этом будет работать корректно.
Собираем приложение Updater.jar
Для этого открываем проект из папки project-updater
Из подключенных пакетов должны быть Zip (встроен в DN) и Updater (собранный нами ранее).
Открываем код модуля загрузчик, ищем строку
1 |
$updater = new GitHubUpdater('TsSaltan', 'DevelNext-Updater'); |
И меняем имя пользователя и название репозитория на своё. Для работы демо версии можно оставить эти значения.
Меняем внешний вид формы UpdateForm под себя. Собираем проект в jar приложение. На выходе получаем файл Updater.jar
Добавляем Updater к своему приложению
(на примере проекта updateMe)
Создаём новый проект (или открываем демо проект updateMe), подключаем пакет Updater.
Необходимо завести переменную (а лучше константу), где будет храниться текущая версия программы. Далее обращаемся к методу, который запустит процесс обновления, можно этот код поместить на событие появления главной формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class MainForm extends AbstractForm { /** * Текущая версия программы */ const VERSION = '1.0.0.0'; /** * @event show */ function doShow(UXWindowEvent $e = null) { // Проверка обновлений // Обязательно нужно передать текущую версию программы UpdateMe::start(self::VERSION); } } |
Собираем программу. Можно в jar, можно в exe (не важно – portable или нет), но обязательно отметить галочку “объединить все исходники в один исполняемый файл”, иначе будут некорректно работать пути в программе, если она запущена от имени администратора. Про это я писал в статье про рабочие директории.
Рядом с исполняемым файлом нужно скопировать файл Updater.jar. Запускаем, проверяем.
Выпускаем обновление
Указываем в проекте новую версию:
1 2 3 4 |
/** * Текущая версия программы */ const VERSION = '2.0.0.0'; |
Собираем, открываем свой репозиторий, раздел releases, создаём новый релиз с указанием версии, заголовка, описания.
Updater поддерживает числовое значение версий, разделённых точкой, например, 1, 1.0, 0.1.2, 1.2.3.4
Если обновление состоит из нескольких файлов, их можно упаковать в zip-архив и он будет распакован в папке с программой.
Проверяем обновление:
Программа успешно обновилась .
p.s. Постарался максимально прокомментировать код. В планах добавить бекап текущей версии перед обновлением, сверку контрольных сумм.
Ничего не работает! Скриншот кода и ошибки внизу.
Ошибка: https://ibb.co/mEb1GK .
В этом проекте нет формы с именем “Updatec”, ошибка явно после изменения кода
Форма UpdateС – моя. (UpdateCheck)
нашел баг! если UpdateMe переместить куда – то и запустить Update и согласиться с установкой обн., а потом перекинутый UpdateMe вернуть с снова с заменой обновленной, то при запуске будет требовать обн. если согласиться то текст “подготовка…” будет бесконечна, при этом не обновляясь и не будет удален файл .tmp. Вообщем это ОБХОД ОБНОВЛЕНИЙ!!! Решения есть?
Добрый день, после дейстивй с командой сборки пакета в CMD, командная строка примерно за секунду сама закрывается и файл пакета расширений не создается. Да и папки build изначально нет. Одним словом после последней команды командная строка закрывается и пакет не создается. Может вы собирете пакет для нас, чтобы сильно не мучаться, а добавите его в архив с файлами. ?…
Собрал
https://yadi.sk/d/3XeaYlj23VFuo3
После дейстивий в кмд в build ничего нету
Пакетов никаких не было(
Не работает. Запускаю… пишет проверка обновлений потом по сути должна передаваться версия в файл updater.jar но он (updater.jar) даже не открывается. Помогите умоляю
Попробуй скачать java
Здравствуйте, встретился с такой ошибкой – Fatal error: Uncaught ParseError: Syntax error, unexpected ‘;’, expecting ‘:’ in res://app/modules/AppModule.php on line 23, position 61
Пишет, что-бы поменять ; на : здесь – $currentVersion = $GLOBALS[‘argv’][1] ?? ‘0.0.0.1’;
Пакет Updater встроен
Самое интересное, что я ничего не менял/трогал, а ошибка присутствует.
Разобрался. Помогло обновление, а я мучался час с попыткой исправить ошибку без обновления:P.
Не понимаю, почему у меня не автообновлялся DevelNext…
Если вы не против, то удалите мои комменты, а то чот стыдно…
Извиняюсь, разобрался
в чём было дело?
Чёто ничего не получается… Если значения по умолчанию – программа обновляется, если меняю значения на свои – ничего не происходит. Я закинул архив UpdateMe.zip на github, сменил имя пользователя и название репозитория, указал какой файл скачивать (UpdateMe.zip), экспериментировал с версиями, результат один – не видит обновления. Переменная $check вообще ничего не возвращает…
Такая-же проблема.
Круто. Встрою в DevelNext MOD по возможности. Ну если ты не против :D
Конечно не против. Я ещё не делал пост в группе вк, думал никто не заметит эту статью) Нужно ещё хорошенько протестировать на наличие ошибок.