我正在使用electron-builder
和electron-updater
way来更新我的申请。
情境:
我的应用程序在启动时会在一分钟内检查更新。之后,它每5小时检查一次更新。下载新更新时,我并没有强迫我的用户安装应用程序。相反,安装更新的应用程序将在应用程序退出时启动。我只是通过“立即安装”按钮向他们展示“新的更新可用”,以便他们可以根据需要(使用quitAndInstall
)或退出应用程序或下次启动时更新它。
以下是与电子更新者相关的一些查询。
我注意到每次都会下载构建版本。假设有更新可用,那么当应用程序打开时,将在一分钟内开始下载新更新。现在没有安装新的应用程序,因此在5小时后它将再次检查新的更新。版本将不匹配,因此即使已经下载,它也会再次开始下载更新。这是默认行为还是我遗漏了什么?我怎么能阻止这种情况发生?它使用并影响我的客户数据和我的AWS带宽!
下载更新时。用户更新应用程序后,它的安装程序仍然可用,不会被删除。 (例如: - 在版本1.0.0上运行,2.0.0的更新可用并下载,触发quitAndInstall
并更新了应用程序。安装后,installer-2.0.0.exe仍然存在。这是默认行为吗?几天后它(或Windows)是否删除了这个下载的文件?
我已经搜索过这件事,但直到现在还没有运气!以下是一些版本细节。
electron : 2.0.2
,electron-builder : 20.15.1
和electron-updater : 2.21.10
答案 0 :(得分:0)
已解决了这两个问题
electron-builder: 2.17.0
和electron-updater: 2.23.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