如何使用电子更新器自动更新电子应用程序?
Posted
技术标签:
【中文标题】如何使用电子更新器自动更新电子应用程序?【英文标题】:How to auto update the electron application using the electron-updater? 【发布时间】:2019-04-29 17:38:07 【问题描述】:我有一个 Angular 应用程序,它已使用电子生成器转换为桌面应用程序。现在,我正在尝试在其中实现自动更新功能。我不希望 electron-builder 将更改发布到 github 存储库。 (注意:整个应用程序位于私有 github 存储库中。)我想手动将必要的 .dmg、.zip、.yml 文件上传到发布标签,并且我希望自动更新程序能够获取这些文件。我怎样才能做到这一点?
目前,我将源 .zip 和 .tar.gz 作为我的发布标签的一部分。每当我在应用程序准备就绪时尝试调用 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)
这是我的代码:
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();
);
);
);
);
updater.ts 中的check()
方法在应用准备就绪时从 main.ts 调用,如下所示:
app.on('ready', async () =>
mainWinProcess() // handles all the browser window ops.
createTray();
setTimeout(updater.check, 2000);
);
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"
谁能指出我正确的方向。我正在尝试在开发环境中执行此操作。
谢谢。
【问题讨论】:
【参考方案1】:如果您想测试,只需启动本地服务器,然后将您的文件(dmg、zip、yml、json)放在那里(假设在 localhost:3000 上)。然后,调用 API .setFeedURL
(document here)。
例如:autoUpdater.setFeedURL("http://localhost:3000/latest-mac.json")
并致电 autoUpdater.checkForUpdates()
。
electron-builder 文档中的注释:
请注意,为了开发/测试 UI/UX 的更新而无需打包 您需要在应用程序中有一个名为 dev-app-update.yml 的文件 项目的根目录,它与您的发布设置相匹配 electron-builder 配置(但采用 yaml 格式)。但它不是 推荐,最好测试已安装应用程序的自动更新 (尤其是在 Windows 上)。推荐 Minio 作为本地服务器 测试更新。
【讨论】:
谢谢 :) 将尝试这样做并返回。 这很有帮助。再次感谢你:) @ShellZero 没问题 :)以上是关于如何使用电子更新器自动更新电子应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何静默自动更新通过 NSIS 为所有用户/每台机器安装的电子应用程序?