Автоматическое обновление электрона

Electron

предисловие

Мы разрабатываем настольное электронное приложение и надеемся, что, как только мы выпустим последнюю версию, пользователь будет уведомлен об обновлении нового пакета. Те, что идут с электроном, имеютautoUpdater, на этот раз мы выбираемelectron-updaterЭто сторонний плагин. Давайте поговорим о том, что происходит с электрономautoUpdaterНедостаток в том, что нет возможности контролировать время загрузки (на данный момент я вижу, что в официальном документе нет этой функции, если есть какое-то исправление, добро пожаловать), и я не знаю ход загрузки; иelectron-updaterНо есть эта функция, Самое большое преимущество этой функции в том, что мы можем иметь несколько версий в официальной среде и время от времени отслеживать ход загрузки;

electron-updaterИнструкции по применению

1. Представьте
$ yarn add electron-updater electron-log electron-is-dev
  • electron-updater Зависимости, необходимые для автоматического обновления
  • electron-logОбновленный журнал может храниться локально
  • electron-is-devОпределить, является ли электрон средой разработки

2,electron-updaterОписание каждого события в
Event: error

Срабатывает при возникновении ошибки в обновлении

вернуть:

  • error Error
Event: checking-for-update

Запускается, когда начинается проверка обновлений

возвращает:

  • нет возвращаемого значения
Event: update-available

Запускается, когда доступен пакет обновления

возвращает:

 {
     "version": "0.1.0", // 最新版本号
     "files": [{
         "url": "text Setup 0.1.0.exe", // 包的名称
         "sha512": "xxx",
         "size": 899999562, // 包的大小
     }],
     "path": "text Setup 0.1.0.exe", // 包的名称
     "sha512": "xxx",
     "relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
     "relaseNotes": "修复XXX", // 新包发布内容
 }
Event: update-not-available

Срабатывает, когда не обнаружено доступных обновлений

возвращает:

  • нет возвращаемого значения
Event: download-progress

Следите за ходом загрузки

возвращает:

{
    "delta":"22108084", // 差量
    "bytesPerSecond": "20243532", // 下载速度
    "percent":'73.32491979950667', // 已下载的百分比
    "total":"82879166", // 更新包的大小
    "transferred": "82879166" // 已下载的包大小
}
Event: update-downloaded

Запускается при загрузке пакета обновления

Возвращаемое значение:

  {
      "version": "0.1.0", // 最新版本号
      "files": [{
          "url": "text Setup 0.1.0.exe", // 包的名称
          "sha512": "xxx",
          "size": 899999562, // 包的大小
      }],
      "path": "text Setup 0.1.0.exe", // 包的名称
      "sha512": "xxx",
      "relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
      "relaseNotes": "修复XXX", // 新包发布内容
  }

метод:

autoUpdaterимеет следующие методы

  • autoUpdater.checkForUpdates() => Promise<UpdateCheckResult>

    Спросите сервер, доступно ли обновление

  • autoUpdater.checkForUpdatesAndNotify() ⇒ Promise< | UpdateCheckResult>

    Спросите сервер, есть ли обновление, загрузите его и сообщите, доступно ли обновление.

  • autoUpdater.downloadUpdate(cancellationToken) ⇒ Promise<any>

    Начните скачивать обновления вручную. еслиautoDownloadустановлен, вы можете использовать этот методfalse

    вернуть:Promise<any>- Путь к скачанному файлу.

    • cancelToken CancellationToken
  • autoUpdater.getFeedURL()⇒ undefined| null|String autoUpdater.setFeedURL(options)

    Настройте поставщика обновлений. если значениеstring,ноОбщие параметры серверазначение будет установлено наurl.

    ОпцииPublishConfiguration| String| GithubOptions| S3Options| SpacesOptions| GenericServerOptions| BintrayOptions- если вы хотите переопределить конфигурацию вapp-update.yml.

  • autoUpdater.channel (getter和setter

    Используйте для определения канала, которому будет следовать программа автоматического обновления (см.Используйте каналы для автоматических обновлений),autoUpdater.channel = 'beta'или используйте, чтобы получить текущий каналcurrentChannel = autoUpdater.channel.

  • autoUpdater.quitAndInstall(isSilent, isForceRunAfter)

    После загрузки обновления перезапустите приложение и установите обновление. должно быть толькоupdate-downloadedОн вызывается после его испускания.

    Уведомление: autoUpdater.quitAndInstall()сначала закроет все окна приложения перед выдачейbefore-quitмероприятиеapp. Это отличается от обычной последовательности выходных событий.

    isSilent Boolean- только WindowsЗапустите установщик в тихом режиме. По умолчаниюfalse.

    isForceRunAfter- BooleanДаже автоматическая установка может запустить приложение после завершения. не применяетсяmacOS. игнорировать лиisSilentУстановить какfalse.


API

  • autoDownload= trueBoolean — следует ли автоматически загружать обновления после их обнаружения.

  • autoInstallOnAppQuit= trueboolean - устанавливать ли автоматически скачанные обновления при выходе из приложения (еслиquitAndInstallранее не звонил).

    Доступно только для Windows и Linux.

  • allowPrerelease= falseboolean - * Только провайдеры GitHub. * Разрешить ли обновлять предварительные версии. По умолчаниюtrueСодержит ли версия приложения предварительные версии компонентов (например,0.12.1-alpha.1, здесьalphaдля предварительных версий компонентов), в противном случаеfalse.

    еслиtrue, даунгрейд разрешен (allowDowngradeбудет установлен наtrue).

  • fullChangelog= falseboolean - * Только провайдеры GitHub. * Получите все примечания к выпуску (от текущего до последнего), а не только последний.

  • allowDowngrade= falseBoolean — разрешать ли переход на более раннюю версию (когда пользователь из бета-канала хочет вернуться к стабильному каналу).

    Учитывается только если каналы разные (с точки зрения семантического версионирования, предрелизных компонентов).

  • currentVersionSemVer — текущая версия приложения.

  • channelСтрока — получить канал обновления. Недоступно для GitHub.channelНе вернется из конфигурации обновления, только если она была установлена ​​ранее.

  • requestHeaders[key:string]:string — Заголовки запроса.

  • loggerЖурнал вы можете пройти через следующий интерфейсelectronic-log,winstonили другие журналы:{ info(), warn(), error() }. Если вы хотите отключить ведение журнала, установите для него значениеnull.

  • signals= new UpdaterSignal(this) UpdaterSignal-Для безопасности типов вы можете использовать такие сигналы, какautoUpdater.signals.updateDownloaded(() => {})заменятьautoUpdater.on('update-available', () => {})


Пример автоматического обновления

  • существуетpackage.jsonконфигурация в
{
    ....
    "build": {
    	"releaseInfo": {
          "releaseNotes": "优化我的订单、信息库、角色功能,新增退费、退费订单审核" // 更新的内容
        },
		"publish": [
          {
            "provider": "generic",
            "url": "http://127.0.0.1:8080/download/", // 推送的地址
            "channel": "latest" // 检查更新的渠道
          }
        ],
	} 
	....
}
  • добавить в каталогapp-updater.yml 和 dev-app-updater.ymlфайл, используемый в качестве конфигурации для проверки обновленных файлов
# 在app-update.yml中配置检查更新的地址,这个地址为正式环境下的更新地址
provider: 'generic'
url: 'http://127.0.0.1:8080/download/'
channel: 'latest'
# 在dev-app-update.yml中配置检查更新的地址,这个地址为开发环境下的地址
provider: 'generic'
url: 'http://127.0.0.1:8080/test-download/'
channel: 'latest'
  • существуетAPPAutoUpdater.jsсередина
const { autoUpdater } = require('electron-updater')
const Store = require('electron-store')
const path = require('path')
global.store = new Store()
autoUpdater.logger = require('electron-log')
// 监听输出的日志
autoUpdater.logger.transports.file.level = 'info'
// 设置当前的版本号为自动更新的版本号
global.currentVersion = autoUpdater.currentVersion
autoUpdater.autoDownload = false // 将自动下载包设置为false,产品的需求是让用户自己点击更新下载
// 监听自动更新的几个事件
// 监听如果自动更新失败将停止安装
autoUpdater.on('error', () => {
  // todo something
})
// 检查更新是否已开始时发出
autoUpdater.on('checking-for-update', () => {})
// 检测有可更新的应用包
autoUpdater.on('update-available', info => {
  // todo something
})
// 检测没有可用更新时发出
autoUpdater.on('update-not-available', info => {
  // todo something
})
// 下载可更新的安装包
autoUpdater.on('update-downloaded', info => {
 // todo something
})
// 监听下载进度
autoUpdater.on('download-progress', info => {
  // todo something
})
module.exports = {
  checkVersion() {
    if (global.isDev) {
      autoUpdater.updateConfigPath = path.join(__dirname, '../../dev-app-update.yml')
    }
    autoUpdater.checkForUpdates()
  }
}
  • В основном процессе электронного index.js

// 主页面一旦加载完成后就开始执行检查更新
mainWindow.webContents.on('did-finish-load', () => {
    AppUpdater.checkVersion()
})