Durante aproximadamente 3 semanas he estado trabajando en una aplicación Electron y finalmente decidí comenzar a agregar la verificación de actualizaciones. Para mi investigación, la forma estándar de hacer esto en Electron (usando Squirrel) requiere que el usuario instale físicamente la aplicación en su computadora. Preferiría no hacer esto y mantener todo lo más portátil posible. Luego decidí intentar crear mi propio script de actualización haciendo que el programa descargara el archivo update.zip y lo extrajera para sobrescribir los archivos existentes. Esto funciona bien, hasta el final. Al final de la extracción, recibo un Invalid package y falta el archivo app.asar real, lo que inutiliza la aplicación.
Estoy usando esto para descargar y extraer las actualizaciones:
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(); } }); }Y llamarlo con:
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(); }); Y uso el paquete NPM de unzipper ( https://www.npmjs.com/package/unzipper ).
El código funciona perfectamente para todos los demás zips, pero falla al intentar extraer un zip que contiene una aplicación Electron.
¿Algo que esté haciendo mal, o tal vez un paquete diferente que admita correctamente la extracción de zips con archivos .asar?
Edición 1 Acabo de encontrar https://www.npmjs.com/package/electron-basic-updater , que no arroja el mismo error de JavaScript, sin embargo, todavía no extrae los archivos .asar correctamente y arrojará su propio error. Dado que todavía falta el .asar, la aplicación sigue siendo inútil después de la "actualización"
Gracias a su enlace a electron-basic-updater , encontré este problema mencionado allí: https://github.com/TamkeenLMS/electron-basic-updater/issues/4 .
Hacen referencia al problema en la aplicación de electrones: https://github.com/electron/electron/issues/9304 .
Finalmente, al final del segundo tema hay una solución:
Esto se debe a que el módulo electron fs trata los archivos asar como directorios en lugar de archivos. Para que el proceso de descompresión funcione, debe hacer una de estas dos cosas:
- Establecer proceso.noAsar = verdadero
- Use original-fs en lugar de fs
He visto a la gente que trabaja con original-fs. Pero me pareció un gran problema.
Así que intenté configurar process.noAsar = true (y luego process.noAsar = false después de descomprimir), y funcionó de maravilla.