代码之家  ›  专栏  ›  技术社区  ›  ShellZero

如何使用电子更新程序自动更新电子应用程序?

  •  0
  • ShellZero  · 技术社区  · 7 年前

    我有一个棱角分明的应用程序,它已经被转换成一个使用电子生成器的桌面应用程序。现在,我正在尝试在其中实现自动更新功能。我不希望Electron Builder将更改发布到Github存储库。(注意:整个应用程序都在一个专用的Github报告上。)我想手动将必要的.dmg,.zip,.yml文件上载到发布标签上,我想让自动更新程序获取这些文件。我怎样才能做到这一点?

    目前,我将source.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)
    

    以下是我的代码:

    更新版本

    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();
                        }
                    });
                });
            }
        });
    });
    

    } 这个 check() 当应用程序准备就绪时,从main.ts调用updater.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 回复  |  直到 7 年前
        1
  •  1
  •   Hai Pham    7 年前

    如果您想测试,只需启动一个本地服务器,然后将文件(dmg、zip、yml、json)放在那里(假设它在localhost:3000上)。然后,调用API .setFeedURL ( document here )

    例如: autoUpdater.setFeedURL("http://localhost:3000/latest-mac.json") 然后打电话 autoUpdater.checkForUpdates() .

    电子制造商文件中的注释:

    注意,为了在不打包的情况下开发/测试更新的UI/UX 您需要的应用程序中有一个名为dev-app-update.yml的文件 与发布设置相匹配的项目根目录 电子生成器配置(但采用yaml格式)。但它不是 建议,最好测试已安装应用程序的自动更新 (尤其是在窗户上)。建议将minio作为本地服务器用于 正在测试更新。

    推荐文章