96 lines
2.7 KiB
JavaScript
96 lines
2.7 KiB
JavaScript
// Install native module from npm and compile it for Electron.
|
|
// Usage: npm run install-native -- name_of_native_module
|
|
|
|
'use strict';
|
|
|
|
var childProcess = require('child_process');
|
|
var Q = require('q');
|
|
var appDir = require('fs-jetpack').cwd(__dirname, '../app');
|
|
var argv = require('yargs').argv;
|
|
var utils = require('./utils');
|
|
|
|
var ensureElectronRebuildInstalled = function () {
|
|
var deferred = Q.defer();
|
|
|
|
try {
|
|
// If require is successful it means module is already installed.
|
|
require('electron-rebuild');
|
|
deferred.resolve();
|
|
} catch (err) {
|
|
childProcess.spawn(utils.spawnablePath('npm'), [
|
|
'install', '--save-dev', 'electron-rebuild'
|
|
], {
|
|
stdio: 'inherit'
|
|
})
|
|
.on('error', deferred.reject)
|
|
.on('close', deferred.resolve);
|
|
}
|
|
|
|
return deferred.promise;
|
|
};
|
|
|
|
var ensurePostinstallRunsElectronRebuild = function () {
|
|
var postinstallScript = 'node ../tasks/rebuild_native_modules';
|
|
|
|
var appManifest = appDir.read('package.json', 'json');
|
|
|
|
if (typeof appManifest.scripts === 'undefined') {
|
|
appManifest.scripts = {};
|
|
}
|
|
|
|
// Let's do it 100% bulletproof and check if programmer didn't
|
|
// pust some custom stuff into postinstall script already.
|
|
if (typeof appManifest.scripts.postinstall === 'undefined') {
|
|
appManifest.scripts.postinstall = postinstallScript;
|
|
appDir.write('package.json', appManifest);
|
|
} else if (appManifest.scripts.postinstall.indexOf(postinstallScript) === -1) {
|
|
appManifest.scripts.postinstall += ' && ' + postinstallScript;
|
|
appDir.write('package.json', appManifest);
|
|
}
|
|
|
|
return Q();
|
|
};
|
|
|
|
var installNativeModule = function () {
|
|
var deferred = Q.defer();
|
|
var moduleName = argv._[0];
|
|
|
|
if (!moduleName) {
|
|
deferred.reject('Module name not specified! Correct usage is "npm run install-native -- name_of_native_module" (remember about space after "--").');
|
|
} else {
|
|
childProcess.spawn(utils.spawnablePath('npm'), [
|
|
'install', '--save', moduleName
|
|
], {
|
|
cwd: appDir.cwd(),
|
|
stdio: 'inherit'
|
|
})
|
|
.on('error', deferred.reject)
|
|
.on('close', deferred.resolve);
|
|
}
|
|
|
|
return deferred.promise;
|
|
};
|
|
|
|
var runRebuild = function () {
|
|
var deferred = Q.defer();
|
|
|
|
childProcess.spawn(utils.spawnablePath('npm'), [
|
|
'run', 'postinstall'
|
|
], {
|
|
cwd: appDir.cwd(),
|
|
stdio: 'inherit'
|
|
})
|
|
.on('error', deferred.reject)
|
|
.on('close', deferred.resolve);
|
|
|
|
return deferred.promise;
|
|
};
|
|
|
|
ensureElectronRebuildInstalled()
|
|
.then(ensurePostinstallRunsElectronRebuild)
|
|
.then(installNativeModule)
|
|
.then(runRebuild)
|
|
.catch(function (err) {
|
|
console.error(err);
|
|
});
|