用於更新electron-app.asar的nodejs模塊

electron-asar-hot-updater

NPM

What it is

一個用於electron的NodeJs模塊,用於支持app.asar的更新,基於electron-asar-updater重構node

Github: github.com/yansenlei/e…git

若是electron-updater支持差別更新,那應該是最佳選擇了,貌似目前正在嘗試,期待ing...github

如何工做 (Read this first)

  • 用於處理更新Electron應用程序內app.asar文件的過程;它只是用名爲「update.asar」的新文件替換app.asar文件(在/ resources /)!
  • 檢查「更新」必須由應用程序觸發。 EAU不會自行進行任何形式的按期檢查。
  • EAU與API進行對話,告訴它是否有新的更新。
    • API接收來自EAU的請求,其中包含客戶端當前版本的應用程序(必須在應用程序package.json文件中指定)
    • 而後,API以新更新響應,或者只是false以停止。
    • 若是有可用更新,則API應使用此更新update.asar文件的源進行響應。
    • EAU而後下載.asar文件,刪除舊的app.asar並將update.asar重命名爲app.asar。

爲什麼要使用它 ? (用例)

  • 若是您認爲這些太複雜而沒法實施: www.npmjs.com/package/ele… electron.atom.io/docs/v0.33.…
  • 若是您認爲在更換一個文件(一般爲40MB),.app或.exe文件(最多100MB)是不合理的。
  • 須要在更新時查看進度。
  • 選擇使用服務器端檢查或客戶端檢查。
  • 能夠使用zip壓縮文件,壓縮你的ASAR使其更小。

安裝

$ npm install --save electron-asar-hot-updater
複製代碼

如今,在main.js文件中,調用它以下:express

const { app, dialog } = require('electron');
const EAU = require('electron-asar-hot-updater');

app.on('ready', function () {
  // Initiate the module
  EAU.init({
    'api': 'http://...', // The API EAU will talk to
    'server': false // Where to check. true: server side, false: client side, default: true.
  });

  EAU.check(function (error, last, body) {
    if (error) {
      if (error === 'no_update_available') { return false; }
      dialog.showErrorBox('info', error)
      return false
    }

    EAU.progress(function (state) {
      // The state is an object that looks like this:
      // {
      // percent: 0.5, 
      // speed: 554732, 
      // size: {
      // total: 90044871, 
      // transferred: 27610959 
      // },
      // time: {
      // elapsed: 36.235, 
      // remaining: 81.403 
      // }
      // }
    })

    EAU.download(function (error) {
      if (error) {
        dialog.showErrorBox('info', error)
        return false
      }
      dialog.showErrorBox('info', 'App updated successfully! Restart it please.')
    })

  })
})
複製代碼

服務端例子

例如,服務器能夠返回版本詳細信息npm

const express = require('express')
var bodyParser = require('body-parser');
const app = express()

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

var desktop_app_version = '1.0.0';
var desktop_app_URL = 'http://127.0.0.1:8083/update.asar' // or ../update.zip

app.post('/update', function (req, res) {
  if(req.body && req.body.current != desktop_app_version){ // check for server side
    res.write(JSON.stringify( {"last": desktop_app_version, "source": desktop_app_URL} ).replace(/[\/]/g, '\\/') );
  }else{
    res.write(JSON.stringify( {"last": desktop_app_version} ).replace(/[\/]/g, '\\/') );
  }
  res.end();
});

app.listen(3000)
console.log('run port: 3000')
複製代碼

或者您能夠返回版本信息供客戶端檢查json

app.post('/update', function (req, res) {
  res.write(JSON.stringify( {
    "name": "app",
    "version": "0.0.1",
    "asar": "http://127.0.0.1:8083/update.asar",
    "info": "1.fix bug\n2.feat..."
  } ).replace(/[\/]/g, '\\/') );
  res.end();
});
複製代碼

若是您使用zip文件,插件將在下載後解壓縮文件,這將使你的更新文件更小,但你必須確保update.asar位於zip包的根目錄:api

── update.zip
   └── update.asar
複製代碼

License

歡迎提交Issues、PRbash

MIT - yansenlei服務器

相關文章
相關標籤/搜索