用于更新electron-app.asar的nodejs模块

electron-asar-hot-updater

NPM

What it is

一个用于electron的NodeJs模块,用于支持app.asar的更新,基于electron-asar-updater重构

Github: https://github.com/yansenlei/electron-asar-hot-updater

如果electron-updater支持差异更新,那应该是最佳选择了,貌似目前正在尝试,期待ing…

如何工作 (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。

为何要使用它 ? (用例)


安装

1
$ npm install --save electron-asar-hot-updater

现在,在main.js文件中,调用它如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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.')
})

})
})

服务端例子

例如,服务器可以返回版本详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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')

或者您可以返回版本信息供客户端检查

1
2
3
4
5
6
7
8
9
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包的根目录:

1
2
── update.zip
└── update.asar

License

欢迎提交Issues、PR

MIT - yansenlei