电子自动更新程序下载多个版本

Electron auto updater downloading multiple builds

我正在使用 electron-builderelectron-updater way 来更新我的应用程序。

场景: 我的应用程序在启动时会在一分钟内检查更新。之后,它每 5 小时检查一次更新。下载新更新时,我不会强迫我的用户安装应用程序。相反,安装更新的应用程序将在应用程序退出时开始。我只是向他们展示 "a new update is available" 和 "Install now" 按钮,以便他们可以根据需要(使用 quitAndInstall)或在他们退出应用程序或下次启动时更新它。

下面是一些与 electron-updater 相关的问题。

我已经搜索过这件事,但直到现在都没有成功!!以下是一些版本详情。

electron : 2.0.2electron-builder : 20.15.1electron-updater : 2.21.10

Both issue has been resolved in electron-builder: 2.17.0 and electron-updater: 2.23.0

在代码中调试了这么多。我找到了解决我的两个问题的方法。

问题:多次下载

(Solved in electron-builder: 2.16.0)

旧解

我发现 electron-updater:2.21.10 已经有一个代码可以在该安装程序已下载时再次停止下载。但是不知何故,使用 lodash 比较 fileinfo 的对象是行不通的,这会产生一个问题。所以直到我们在新版本中得到任何合适的解决方案。我更改了以下代码。

文件:- ..\node_modules\electron-updater\out\DownloadedUpdateHelper.js

return (0, _lodash().default)(_this.versionInfo, versionInfo) && (0, _lodash().default)(_this.fileInfo, fileInfo) && (yield (0, _fsExtraP().pathExists)(updateFile));

只需将 (_this.fileInfo, fileInfo) 更改为 (_this.fileInfo.info, fileInfo.info)。此处提供详细信息:- https://github.com/electron-userland/electron-builder/issues/3003

注意:-(我知道更改 node_modules 不是一个好方法,但这是我目前能做的让节目继续进行的全部。我还提交了 PR同样,所以我所等待的只是一个合适的解决方案)

Update:- PR accepted in electron-builder: 2.16.0


问题:删除安装程序

(Solved in electron-builder: 2.17.0, check for issue #3000)

旧解

我发现到目前为止还没有任何内置解决方案可以删除安装程序,所以我创建了自己的解决方案来处理它。可以通过

来实现

第一步:- 将新下载文件的文件路径和版本保存到 DB 或文件中的某处,作为 JSON Object.

autoUpdater.on('update-downloaded', async (event) => {
    console.log("update-downloaded");
    let download_exe_obj = {path: autoUpdater.downloadedUpdateHelper._file, version: event.version};
    await update_downloaded_exe_data(download_exe_obj);// save download_exe_obj somewhere so that it can be used later on
});

第 2 步:- 应用程序启动时(createWindow)使用保存的 JSON 检查当前应用程序版本。如果我们发现应用程序版本与 json 中保存的版本相同,那么我们可以删除之前下载的安装程序,因为该安装程序已经安装。

const app = electron.app; //to get version and details from package.json
function createWindow() {
    mainWindow = new BrowserWindow({ width: 800, height: 600 })
    ...
    let available_exe_json = await get_downloaded_exe_data(); //get json from where you have saved
    if(available_exe_json != ''){
        let available_exe_obj = JSON.parse(available_exe_json);
        if (available_exe_obj.version != '' && available_exe_obj.version.toString() == app.getVersion().toString()) {
            //remove old installer
            if (available_exe_obj.path != '' && await fs.existsSync(available_exe_obj.path)) {
              await fs.unlinkSync(available_exe_obj.path);
              await update_downloaded_exe_data('');//update with blank where you have saved previous data
            }
        }
    }
}

我们还可以设法删除多个安装程序。有关此解决方案的更多详细信息,请参见此处:- https://github.com/electron-userland/electron-builder/issues/3000#issuecomment-396833579