Электронная упаковка - ошибка файла ASAR

Я упаковываю приложение Meteor с помощью Electrify (расширение Electron-Packager). Поскольку пути узловых модулей слишком велики для Windows, чтобы их принять, я добавил "--asar=true" в качестве опции упаковки.

Теперь, когда я пытаюсь запустить упакованное приложение, я получаю следующую ошибку:

shell.js: internal error
Error: ENOENT: no such file or directory, mkdir 'C:\Users\myusername\MyApp\.electrify\.dist\MyApp-win32-x64\resources\app.asar\db'
    at Error (native)
    at Object.fs.mkdirSync (fs.js:799:18)
    at mkdirSyncRecursive 

...

        at Socket.g (events.js:260:16)
    module.js:338
        throw err;

Кажется, есть проблема с чтением файла asar. Знаете ли вы, как это исправить?

1 ответ

Такая ошибка может возникнуть, когда вы включаете в свое приложение нативные модули. Собственные модули требуют компиляции для конкретного узла ОС, на котором построено ваше приложение. Поэтому при сжатии в ASAR вы должны исключить все собственные модули, которые есть в вашем проекте. Это делается с помощью опции unpackDir внутри опции "asar" в ваших общих опциях упаковщика. Например, в моей сборке gulp я делаю что-то вроде этого:

var gulp = require('gulp');
var $ = require('gulp-load-plugins')({lazy: true});
var config = require('./gulp.config')();
var packager = require('electron-packager');
var electronPackage = require('electron/package.json');
var electronVersion = electronPackage.version;
var pkg = require('./package.json');

// Build the electron app
gulp.task('build:electron', function(cb) {

    var opts = {
        name: pkg.name,
        platform: 'win32',
        arch: 'ia32',                           // ia32, x64 or all
        dir: config.root,                       // source location of app
        out: config.electronbuild,              // destination location for app os/native binaries
        ignore: config.electronignore,          // don't include these directories in the electron app build
        icon: config.icon,
        asar: {unpackDir: config.electroncompiled}, // compress project/modules into an asar blob but don't use asar to pack the native compiled modules
        overwrite: true,
        prune: true,
        electronVersion: electronVersion,       // Tell the packager what version of electron to build with
        'app-copyright': pkg.copyright,         // copyright info
        'app-version': pkg.version,             // The version of the application we are building
        win32metadata: {                        // Windows Only config data
            CompanyName: pkg.authors,
            ProductName: pkg.name,
            FileDescription: pkg.description,
            OriginalFilename: pkg.name + '.exe'
        }
    };

    packager(opts, function(err, appPath) {
        $.util.log(' <- packagerDone()', err, appPath);
        log(' all done!');
        cb();
    });

});

Для вашего случая важна строка для опции asar. Вы хотите быть уверены, что вы делаете что-то вроде asar: {unpackDir: config.electroncompiled} и просто замените config.electroncompiled переменная с глобусом каталогов вашего файла, который включает в себя любые пакеты, скомпилированные в нативе, которые использует ваш проект (такие вещи как libxml-xsd, libxmljs-mt, nslog так далее). Надеюсь, что это имеет смысл.

Другие вопросы по тегам