Обновление приложений
Существует несколько способов обеспечить автоматические обновления вашего приложения Electron. Самый простой и официально поддерживаемый способ — использование встроенного фреймворка Squirrel и модуля autoUpdater Electron.
Использование update.electronjs.org
Команда Electron поддерживает update.electronjs.org, бесплатную и открытую веб-службу, которую могут использовать приложения Electron для самостоятельного обновления. Сервис предназначен для приложений Electron, отвечающих следующим критериям:
- Приложение работает на macOS или Windows
- Приложение имеет общедоступный репозиторий GitHub
- Сборки опубликованы в GitHub Releases
- Сборки подписаны кодом
Самый простой способ использовать эту службу — установить update-electron-app, модуль Node.js, предварительно настроенный для работы с update.electronjs.org.
Установите модуль с помощью менеджера пакетов Node.js по вашему выбору:
- npm
- Yarn
npm install update-electron-app
yarn add update-electron-app
Затем вызовите обновлитель из файла основного процесса вашего приложения:
require('update-electron-app')()
По умолчанию этот модуль будет проверять наличие обновлений при запуске приложения, а затем каждые десять минут. При обнаружении обновления оно будет автоматически загружено в фоновом режиме. По завершении загрузки будет отображаться диалоговое окно, позволяющее пользователю перезапустить приложение.
Если вам нужно настроить конфигурацию, вы можете передать параметры update-electron-app или непосредственно использовать службу обновления.
Использование других сервисов обновления
Если вы разрабатываете закрытое приложение Electron или не публикуете релизы в GitHub Releases, возможно, потребуется запустить собственный сервер обновления.
Шаг 1: Развертывание сервера обновления
В зависимости от ваших потребностей вы можете выбрать один из этих вариантов:
- Hazel — Сервер обновления для частных или открытых приложений, который можно бесплатно развернуть на Vercel. Он получает данные из GitHub Releases и использует возможности кэширования CDN GitHub.
- Nuts — Также использует GitHub Releases, но кэширует обновления приложений на диске и поддерживает закрытые репозитории.
- electron-release-server — Предоставляет панель управления для управления выпусками и не требует, чтобы релизы исходили из GitHub.
- Nucleus — Полный сервер обновлений для приложений Electron, поддерживаемый Atlassian. Поддерживает несколько приложений и каналов; использует хранилище статических файлов для минимизации затрат на сервер.
После развертывания сервера обновления вы можете добавить в свой код приложения средства получения и применения обновлений с помощью модуля [autoUpdater] Electron.
Шаг 2: Получение обновлений в вашем приложении
Сначала импортируйте необходимые модули в код основного процесса. Следующий код может отличаться для разных программного обеспечения сервера, но он работает так, как описано, при использовании Hazel.
Убедитесь, что код ниже будет выполняться только в упакованном приложении, а не в режиме разработки. Вы можете использовать API app.isPackaged для проверки среды.
const { app, autoUpdater, dialog } = require('electron')
Далее, сформируйте URL-адрес ленты сервера обновления и сообщите об этом autoUpdater:
const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`
autoUpdater.setFeedURL({ url })
На последнем шаге проверьте наличие обновлений. Приведенный ниже пример будет проверять каждые минуту:
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)
После того, как ваше приложение упаковано, оно будет получать обновление для каждого нового GitHub Release, который вы опубликуете.
Шаг 3: Уведомление пользователей о наличии обновлений
Теперь, когда вы настроите базовый механизм обновления для приложения, вам нужно убедиться, что пользователь будет уведомлен о наличии обновления. Это можно сделать, используя события API autoUpdater:
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'A new version has been downloaded. Restart the application to apply the updates.',
}
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})
Также убедитесь, что обрабатываются ошибки. Вот пример их регистрации в stderr:
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
})
Поскольку запросы, выполняемые autoUpdate, не находятся под вашим прямым контролем, могут возникнуть ситуации, которые сложно обработать (например, если сервер обновления защищен аутентификацией). Поле url поддерживает протокол file://, что означает, что при определенных усилиях вы можете обойти аспект связи с сервером в процессе, загрузив обновление из локального каталога. Вот пример того, как это можно сделать.
© GitHub Inc.
Licensed under the MIT license.
https://www.electronjs.org/docs/latest/tutorial/updates