大约3个星期我一直在使用Electron应用程序,最后决定开始添加更新检查。对于我的研究,在Electron(使用Squirrel)中执行此操作的标准方法要求用户将应用程序物理安装到其计算机上。我宁愿不这样做,并尽可能保持一切便携。然后,我决定尝试通过让程序下载update.zip来创建自己的更新脚本,然后将其解压缩以覆盖现有文件。这很有效,直到最后。在提取的最后,我收到Invalid package
错误,并且缺少实际的app.asar
文件,导致应用程序无用。
我用它来下载并提取更新:
function downloadFile(url, target, fileName, cb) { // Downloads
var req = request({
method: 'GET',
uri: url
});
var out = fs.createWriteStream(target+'/'+fileName);
req.pipe(out);
req.on('end', function() {
unzip(target+'/'+fileName, target, function() {
if (cb) {
cb();
}
});
});
}
function unzip(file, target, cb) { // Unzips
var out = fs.createReadStream(file);
out.pipe(unzipper.Extract({ path: target })).on('finish', function () {
dialog.showMessageBox({
type: 'question',
message: 'Finished extracting to `'+target+'`'
});
if (cb) {
cb();
}
});
}
并将其命名为:
downloadFile('http://example.com/update.zip', path.join(__dirname, './'), 'update.zip', function() { // http://example.com/update.zip is not the real source
app.relaunch();
app.quit();
});
我使用unzipper
NPM包(https://www.npmjs.com/package/unzipper)。
该代码适用于所有其他拉链,但在尝试提取包含Electron应用程序的zip时失败。
我做错了什么,或者是否有一个不同的软件包能够正确支持使用.asar文件提取拉链?
修改1 我刚刚找到了https://www.npmjs.com/package/electron-basic-updater,它没有抛出相同的JavaScript错误,但它仍然没有正确提取.asar文件,并且会抛出它的自己的错误。由于.asar仍然缺失,因此在"更新"
之后应用仍然无用答案 0 :(得分:0)
感谢您与electron-basic-updater
的链接,我发现此处提到了此问题:https://github.com/TamkeenLMS/electron-basic-updater/issues/4。
他们参考电子应用中的问题:https://github.com/electron/electron/issues/9304。
最后,在第二个主题的最后,有一个解决方案:
这是因为电子fs模块将asar文件视为目录而不是文件。要使解压缩过程正常工作,您需要执行以下两项操作之一:
- 设置process.noAsar = true
- 使用original-fs代替fs
我见过那些使用原始fs的人。但对我来说这看起来很麻烦。
所以我尝试设置process.noAsar = true
(然后在解压后设置process.noAsar = false
) - 这就像魅力一样。