Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Electron自动更新程序下载多个版本_Electron_Electron Builder - Fatal编程技术网

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

Electron自动更新程序下载多个版本,electron,electron-builder,Electron,Electron Builder,我正在使用electron-builder和electron-updater更新我的应用程序 场景: 我的应用程序在启动后一分钟内检查更新。之后,它每5小时检查一次更新。我不会在下载新更新时强制用户安装应用程序。而是在应用程序退出时开始安装更新的应用程序。我只是向他们展示了带有“立即安装”按钮的“新更新可用”,以便他们可以在需要时(使用退出和安装)或在退出应用程序或下次启动时进行更新 下面是一些与electron updater相关的查询 我注意到构建每次都会下载。比方说,如果有更新可用,那么

我正在使用
electron-builder
electron-updater
更新我的应用程序

场景: 我的应用程序在启动后一分钟内检查更新。之后,它每5小时检查一次更新。我不会在下载新更新时强制用户安装应用程序。而是在应用程序退出时开始安装更新的应用程序。我只是向他们展示了带有“立即安装”按钮的“新更新可用”,以便他们可以在需要时(使用
退出和安装
)或在退出应用程序或下次启动时进行更新

下面是一些与electron updater相关的查询

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

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

关于这件事我已经找过了,但到现在为止运气都不好!!以下是一些版本详细信息

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

这两个问题都已在
electron-builder:2.17.0
electron-updater:2.23.0
在调试了这么多代码之后。我找到了解决这两个问题的办法

问题:多次下载

(在中解决)

旧解决方案

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

文件:-
。\node\u modules\electron updater\out\downloadeUpdateHelper.js

return (0, _lodash().default)(_this.versionInfo, versionInfo) && (0, _lodash().default)(_this.fileInfo, fileInfo) && (yield (0, _fsExtraP().pathExists)(updateFile));
只需将
(\u this.fileInfo,fileInfo)
更改为
(\u this.fileInfo.info,fileInfo.info)
。详情请参阅:

注:-(我知道更换node_模块不是一个好办法,但这是我目前所能做的一切,以保持节目继续进行。我还提交了相同的PR,所以我等待的是一个适当的解决方案)

更新:-在中接受PR


问题:删除安装程序

(在中解决,检查问题)

旧解决方案

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

第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
            }
        }
    }
}
我们还可以设法删除多个安装程序。有关此解决方案的更多详细信息,请参见: