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

时间:2018-06-07 14:50:23

标签: electron electron-builder

我正在使用electron-builderelectron-updater way来更新我的申请。

情境: 我的应用程序在启动时会在一分钟内检查更新。之后,它每5小时检查一次更新。下载新更新时,我并没有强迫我的用户安装应用程序。相反,安装更新的应用程序将在应用程序退出时启动。我只是通过“立即安装”按钮向他们展示“新的更新可用”,以便他们可以根据需要(使用quitAndInstall)或退出应用程序或下次启动时更新它。

以下是与电子更新者相关的一些查询。

  • 我注意到每次都会下载构建版本。假设有更新可用,那么当应用程序打开时,将在一分钟内开始下载新更新。现在没有安装新的应用程序,因此在5小时后它将再次检查新的更新。版本将不匹配,因此即使已经下载,它也会再次开始下载更新。这是默认行为还是我遗漏了什么?我怎么能阻止这种情况发生?它使用并影响我的客户数据和我的AWS带宽!

  • 下载更新时。用户更新应用程序后,它的安装程序仍然可用,不会被删除。 (例如: - 在版本1.0.0上运行,2.0.0的更新可用并下载,触发quitAndInstall并更新了应用程序。安装后,installer-2.0.0.exe仍然存在。这是默认行为吗?几天后它(或Windows)是否删除了这个下载的文件?

我已经搜索过这件事,但直到现在还没有运气!以下是一些版本细节。

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

1 个答案:

答案 0 :(得分:0)

  

electron-builder: 2.17.0electron-updater: 2.23.0

已解决了这两个问题

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

问题:多次下载

  

(解决于electron-builder: 2.16.0

旧解决方案

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

文件: - ..\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,所以我等待的是一个适当的解决方案)

  

更新: - electron-builder: 2.16.0

接受公关

问题:正在删除安装程序

  

(在[{3}}中解决,检查问题electron-builder: 2.17.0

旧解决方案

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

来实现

第1步: - 将新下载的文件的文件路径和版本保存到DB或文件中的某个位置作为JSON对象。

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步: - 在应用启动时使用保存的JSON检查当前应用版本(createWindow)。如果我们发现应用版本与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
            }
        }
    }
}

我们还可以设法删除多个安装程序。有关此解决方案的更多详细信息,请访问: - #3000