[英]How to auto update the electron application using the electron-updater?
I have an angular app which has been converted into a desktop app using the electron-builder. 我有一个角度应用程序,已使用电子生成器将其转换为桌面应用程序。 Now, I am trying to implement the auto-updates features into it. 现在,我试图在其中实现自动更新功能。 I don't want electron-builder to publish the changes to the github repository. 我不希望电子建造者将更改发布到github存储库。 (Note: The whole app is on a private github repo.) I want to manually upload the necessary .dmg, .zip, .yml files to the release tag and I want that to be picked up by the auto updater. (注意:整个应用程序都在一个私人的github仓库中。)我想手动将必要的.dmg,.zip,.yml文件上传到release标签,并且希望由自动更新程序将其拾取。 How can I achieve this? 我该如何实现?
Currently, I have the source .zip and .tar.gz as part of my release tag. 目前,我的发布标签中包含源.zip和.tar.gz。 And whenever I try to invoke the autoUpdater.checkForUpdates()
when the app is ready, I get the following error saying: 当应用程序准备就绪时,每当我尝试调用autoUpdater.checkForUpdates()
时,都会收到以下错误消息:
Error: ENOENT, dev-app-update.yml not found in /Users/userX/project-web/build/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar
at notFoundError (ELECTRON_ASAR.js:108:19)
at fs.readFile (ELECTRON_ASAR.js:536:16)
at go$readFile (/Users/userX/project-web/build/node_modules/graceful-fs/graceful-fs.js:85:14)
at readFile (/Users/userX/project-web/build/node_modules/graceful-fs/graceful-fs.js:82:12)
at readFile (/Users/userX/project-web/build/node_modules/universalify/index.js:5:67)
From previous event:
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:460:27
at Generator.next (<anonymous>)
From previous event:
at MacUpdater.loadUpdateConfig (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:456:33)
at Lazy.AppUpdater.configOnDisk (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:142:43)
at Lazy.get value [as value] (/Users/userX/project-web/build/node_modules/lazy-val/src/main.ts:18:23)
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:340:46
at Generator.next (<anonymous>)
at runCallback (timers.js:696:18)
at tryOnImmediate (timers.js:667:5)
at processImmediate (timers.js:649:5)
From previous event:
at MacUpdater.getUpdateInfoAndProvider (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:336:43)
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:363:31
at Generator.next (<anonymous>)
From previous event:
at MacUpdater.doCheckForUpdates (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:360:34)
at MacUpdater.checkForUpdates (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:220:35)
at Timeout.check [as _onTimeout] (/Users/userX/project-web/desktop/src/updater.ts:15:17)
at ontimeout (timers.js:427:11)
at tryOnTimeout (timers.js:289:5)
at listOnTimeout (timers.js:252:5)
at Timer.processTimers (timers.js:212:10)
Here's my code: 这是我的代码:
updater.ts updater.ts
import { autoUpdater } from 'electron-updater';
import { dialog, BrowserWindow, ipcMain } from 'electron';
const log = require('electron-log');
let downloadProgress: number;
log.transports.file.level = "debug";
autoUpdater.logger = log;
autoUpdater.autoDownload = false;
export function check() {
autoUpdater.checkForUpdates();
autoUpdater.on('checking-for-update', () => {
dialog.showMessageBox({
type: 'info',
title: 'Update Available',
message: 'A new version of app is available. Do you want to update now?',
buttons: ['Update', 'No']
}, (index) => {
if (index) {
return;
} else {
autoUpdater.downloadUpdate();
let proWin = new BrowserWindow({
width: 350,
height: 35,
useContentSize: true,
autoHideMenuBar: true,
maximizable: false,
fullscreen: false,
fullscreenable: false,
resizable: false,
title: 'Downloading Update'
});
proWin.loadURL(`file://$(__dirname)/progress`);
proWin.on('closed', () => {
proWin = null;
});
ipcMain.on('download-progress-request', (e) => {
e.returnValue = downloadProgress;
});
autoUpdater.on('download-progress', (d) => {
downloadProgress = d.percent;
autoUpdater.logger.info(downloadProgress);
});
autoUpdater.on('update-downloaded', () => {
if (progressWindow) progressWindow.close();
dialog.showMessageBox({
type: 'info',
title: 'Update Ready',
message: 'A new version of app is ready. Quit and Install now?',
buttons: ['Yes', 'Later']
}, (index) => {
if (!index) {
autoUpdater.quitAndInstall();
}
});
});
}
});
});
} The check()
method in the updater.ts is invoked from the main.ts when the app is ready as follows: 当应用程序准备就绪时,将从main.ts中调用updater.ts中的check()
方法,如下所示:
app.on('ready', async () => {
mainWinProcess() // handles all the browser window ops.
createTray();
setTimeout(updater.check, 2000);
});
package.json as follows: package.json如下:
{
"name": "project-web",
"productName": "Project Web X",
"version": "1.0.0",
"author": "applecool",
"description": "A func app",
"main": "./main.js",
"dependencies": {
"electron-log": "2.2.17",
"electron-updater": "4.0.4",
"path": "0.12.7",
"url": "0.11.0",
"fs-extra": "7.0.1",
"decompress-zip": "0.3.1"
},
"scripts": {
"mac": "NODE_ENV=production ./node_modules/gulp/bin/gulp.js --gulpfile ./ops/gulpfile.js mac",
"mac-dev": "NODE_ENV=development ./node_modules/gulp/bin/gulp.js --gulpfile ./ops/gulpfile.js mac-dev",
"start": "NODE_ENV=development ./node_modules/.bin/electron index.js --debug --enable-logging",
"start-mac-setup-dev": "build --mac --config electron-builder-dev.yml",
"start-mac-setup": "build --mac"
},
"devDependencies": {
"@types/node": "^10.12.9",
"electron": "3.0.10",
"electron-builder": "20.36.2",
"electron-is-dev": "1.0.1",
"electron-reload": "1.3.0",
"gulp": "4.0.0",
"icon-gen": "2.0.0",
"jimp": "0.5.6",
"os": "0.1.1",
"zip-folder": "1.0.0",
"devtron": "1.4.0"
},
"build": {
"appId": "com.projectweb.x"
}
}
Could anyone please point me in a right direction. 任何人都可以向我指出正确的方向。 I am trying to do this in the dev environment. 我正在尝试在开发环境中执行此操作。
Thank you. 谢谢。
If you want to test, just start a local server then put your files (dmg, zip, yml, json) there (assuming that's on localhost:3000). 如果要测试,只需启动本地服务器,然后将文件(dmg,zip,yml,json)放在此处(假定位于localhost:3000上)。 Then, call API .setFeedURL
( document here ). 然后,调用API .setFeedURL
( 此处提供文档 )。
For example: autoUpdater.setFeedURL("http://localhost:3000/latest-mac.json")
and call autoUpdater.checkForUpdates()
. 例如: autoUpdater.setFeedURL("http://localhost:3000/latest-mac.json")
并调用autoUpdater.checkForUpdates()
。
Note from electron-builder document: 电子制造商文档中的注释:
Note that in order to develop/test UI/UX of updating without packaging the application you need to have a file named dev-app-update.yml in the root of your project, which matches your publish setting from electron-builder config (but in yaml format). 请注意,为了在不打包应用程序的情况下开发/测试更新的UI / UX,您需要在项目的根目录中有一个名为dev-app-update.yml的文件,该文件与electronic-builder config中的发布设置相匹配(但yaml格式)。 But it is not recommended, better to test auto-update for installed application (especially on Windows). 但是不建议这样做,最好测试已安装应用程序的自动更新(尤其是在Windows上)。 Minio is recommended as a local server for testing updates. 建议将Minio用作测试更新的本地服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.