2016-04-12 14 views
1

Ich verpacke eine Meteor App mit Electrify (durch Erweiterung der Electron-Packager). Da die Pfade der Knotenmodule für Windows zu tief sind, habe ich "--asar = true" als Verpackungsoption hinzugefügt.Electron Verpackung - ASAR Dateifehler

Nun, wenn ich versuche, meine gepackte Anwendung zu starten, erhalte ich folgende Fehlermeldung:

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; 

Es scheint mit dem Lesen der asar Datei ein Problem zu haben. Weißt du irgendeinen Weg, das zu beheben?

Antwort

0

Diese Art von Fehler kann passieren, wenn Sie native Module in Ihrer Anwendung enthalten. Native Module erfordern die Kompilierung für den betriebssystemspezifischen Knoten, auf dem Ihre App basiert. Während Sie also zu ASAR komprimieren, müssen Sie alle systemeigenen Module ausschließen, die sich in Ihrem Projekt befinden. Dies geschieht mit der Option unpackDir in der Option 'asar' in den Optionen Ihres Gesamtpakets. Zum Beispiel in meinem Zug Build ich so etwas wie diese:

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(); 
    }); 

}); 

Was für Ihren Fall wichtig ist die Linie für die asar Option. Sie möchten sicherstellen, dass Sie etwas wie asar: {unpackDir: config.electroncompiled} tun, und ersetzen Sie einfach die config.electroncompiled Variable mit Ihrem Datei-Glob von Verzeichnissen, die nativ kompilierte Pakete, die Ihr Projekt verwendet (z. B. libxml-xsd, libxmljs-mt, nslog usw.) enthalten. Hoffnung, die Sinn macht.