Quiero escribir un actualizador de electrones que solo descargue el 'app.asar' más nuevo y lo reemplace con el anterior. No quiero usar soluciones como 'electron-updater' porque en su mayoría son exclusivas de Windows y Mac. Así que quiero escribir un "actualizador asar" que funcione en todas las plataformas, incluido Linux. Debería funcionar más o menos como el actualizador de discord, que compara la versión local instalada con la última versión cargada en un servidor web.
En Linux, la mayoría de los formatos de paquetes montan los archivos en directorios en los que mi actualizador necesitaría privilegios de root. Por ejemplo, AppImage monta todos los archivos en un directorio aleatorio dentro de la carpeta '/tmp', o flatpak lo monta en un directorio extraño '/app/lib/' que aún no pude encontrar en mi sistema...
Entonces, mi pregunta sería, ¿cómo puedo reemplazar un archivo asar antiguo por uno actualizado sin tener problemas con los privilegios de root?
Esta es la parte de la lógica del actualizador dentro de 'main.js':
app.whenReady().then(() => { // Updater should only be run in "production" if (isDev) return; // Get path of asar file & resource dir stored on the system const asarPath = app.getAppPath(); // => /tmp/.APPNAMExlsjda345/resources/app.asar/src/electron/ const resourcesPath = path.join(asarPath, ".."); // => /tmp/.APPNAMExlsjda345/resources/ // TODO: compare current version with newest on webserver // TODO: download new version & call it something like "update.asar" // TODO: remove app.asar & rename update.asar to app.asar // TODO: restart the whole app // This is only for testing if I can modify the content of the resources directory fs.copyFile(asarPath, path.join(resourcesPath, "update.asar"), (err) => { if (err) return console.log({ err }); // throws error, see below! console.log("copied: ", fs.readdirSync(resourcesPath)); // if it would be successfull print all the content of resources dir }); } });Este es el error que arroja la función copyFile:
{ err: Error: ENOENT, not found in /tmp/.mount_Babbel2t0KoE/resources/app.asar at createError (node:electron/js2c/asar_bundle:5:1255) at Object.t.<computed> [as copyFile] (node:electron/js2c/asar_bundle:5:2526) at /tmp/.mount_Babbel2t0KoE/resources/app.asar/src/electron/main.js:44:6 { code: 'ENOENT', errno: -2 } }EDITAR: También probé "original-fs", que debería funcionar con archivos asar:
{ err: [Error: EROFS: read-only file system, copyfile '/tmp/.mount_BabbelMjuGx3/resources/app.asar' -> '/tmp/.mount_BabbelMjuGx3/resources/update.asar'] { errno: -30, code: 'EROFS', syscall: 'copyfile', path: '/tmp/.mount_BabbelMjuGx3/resources/app.asar', dest: '/tmp/.mount_BabbelMjuGx3/resources/update.asar' } }