UNPKG

gulp-ll

Version:

Run CPU-consuming Gulp tasks in the separate processes to achieve faster builds.

108 lines (82 loc) 2.89 kB
var spawn = require('child_process').spawn; var gulp = require('gulp'); var PluginError = require('gulp-util').PluginError; var Promise = require('pinkie-promise'); function getTaskListFromArgs (args) { if (Array.isArray(args[0])) return args[0]; return Array.prototype.slice.call(args); } function GulpLL () { this.taskFn = gulp.task.bind(gulp); this.llTasks = []; this.llTasksDebugOnly = []; this.allTasks = []; this.isDebug = typeof v8debug !== 'undefined' || process.argv.indexOf('--ll-debug') > -1; this.isWorker = process.argv.indexOf('--ll-worker') > -1; this.args = process.argv.slice(1).filter(function (arg, idx) { // NOTE: remove debugger breakpoints from worker args return arg.indexOf('--debug-brk') < 0 && (idx !== 0 || arg !== 'debug'); }); if (process.argv.indexOf('--no-ll') < 0) this._overrideGulpTaskFn() } GulpLL.prototype._getWorkerArgs = function (task) { var ll = this; var args = this.args.filter(function (arg) { return ll.allTasks.indexOf(arg) < 0; }); args.splice(1, 0, 'worker:' + task); args.push('--ll-worker'); if (this.isDebug) args.push('--ll-debug'); return args; }; GulpLL.prototype._createWorker = function (task) { var worker = spawn(process.execPath, this._getWorkerArgs(task), { stdio: 'inherit' }); return new Promise(function (resolve, reject) { worker.on('exit', function (code) { if (code === 0) resolve(); else { reject(new PluginError('ll', { message: 'Task ll:' + task + ' failed' })); } }) }); }; GulpLL.prototype._isLLTask = function (task) { return this.llTasks.indexOf(task) > -1 || (this.isDebug && this.llTasksDebugOnly.indexOf(task) > -1); }; GulpLL.prototype._overrideGulpTaskFn = function () { var ll = this; gulp.task = function (name, deps, fn) { if (!fn && typeof deps === 'function') { fn = deps; deps = void 0; } if (ll._isLLTask(name)) { if (ll.isWorker) { deps = void 0; name = 'worker:' + name; } else { fn = function () { return ll._createWorker(name); }; } } ll.allTasks.push(name); ll.taskFn(name, deps, fn); }; }; GulpLL.prototype.tasks = function () { this.llTasks = getTaskListFromArgs(arguments); return this; }; GulpLL.prototype.onlyInDebug = function () { this.llTasksDebugOnly = getTaskListFromArgs(arguments); return this; }; module.exports = new GulpLL();