2017-04-26 77 views
1

大约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

.asar不是我所知道的zip。 – ArsenArsen

+0

我知道它不是。我不想解压缩,我试图解压缩一个.zip文件,其中包含一个.asar文件(在一个zip文件中显示)。发生这种情况时,Electron将无法提取它。 – LordBingShipley

回答

0

感谢您与electron-basic-updater的链接,我发现此处提到此问题:https://github.com/TamkeenLMS/electron-basic-updater/issues/4

他们指的是电子应用程序中的问题:https://github.com/electron/electron/issues/9304

最后,在第二主题的末尾有一个解决方案:

这是由于电子FS模块处理ASAR文件,目录,而不是文件。为了让你需要做的解压过程中工作两件事情之一:

  • 设置process.noAsar =真
  • 使用原装-FS而不是FS

我所见过的人与原始-fs一起工作。但对我来说这看起来很麻烦。

所以我尝试设置process.noAsar = true(然后解压缩后再解压process.noAsar = false) - 这就像一个魅力。