UNPKG

gulp

Version:
194 lines (158 loc) 5.24 kB
#!/usr/bin/env node 'use strict'; var path = require('path'); var argv = require('optimist').argv; var completion = require('../lib/completion'); var semver = require('semver'); var archy = require('archy'); var taskTree = require('../lib/taskTree'); if (argv.completion) { return completion(argv.completion); } var resolve = require('resolve'); var findup = require('findup-sync'); var gutil = require('gulp-util'); var prettyTime = require('pretty-hrtime'); var tasks = argv._; var cliPkg = require('../package.json'); var cwd; if (argv.cwd) { cwd = path.resolve(argv.cwd); } else { cwd = process.cwd(); } loadRequires(argv.require, cwd); var gulpFile; if (argv.gulpfile) { gulpFile = path.join(cwd, argv.gulpfile); } else { gulpFile = getGulpFile(cwd); } // find the local gulp var localGulp = findLocalGulp(gulpFile); var localPkg = findLocalGulpPackage(gulpFile); // print some versions and shit if (argv.v || argv.version) { gutil.log('CLI version', cliPkg.version); if (localGulp) { gutil.log('Local version', localPkg.version); } process.exit(0); } if (!localGulp) { gutil.log(gutil.colors.red('No local gulp install found in'), gutil.colors.magenta(getLocalBase(gulpFile))); gutil.log(gutil.colors.red('Try running: npm install gulp')); process.exit(1); } // check for semver difference in running gulp vs locally installed and warn if running gulp > locally installed if (semver.gt(cliPkg.version, localPkg.version)) { gutil.log(gutil.colors.red('gulp version mismatch:')); gutil.log(gutil.colors.red('Running gulp is', cliPkg.version)); gutil.log(gutil.colors.red('Local gulp (installed in gulpfile dir) is', localPkg.version)); } if (!gulpFile) { gutil.log(gutil.colors.red('No gulpfile found')); process.exit(1); } // Wire up logging for tasks // on local gulp singleton logEvents(localGulp); // Load their gulpfile and run it gutil.log('Using file', gutil.colors.magenta(gulpFile)); loadGulpFile(localGulp, gulpFile, tasks); function loadRequires(requires, baseDir) { if (typeof requires === 'undefined') requires = []; if (!Array.isArray(requires)) requires = [requires]; return requires.map(function(modName){ gutil.log('Requiring external module', gutil.colors.magenta(modName)); var mod = findLocalModule(modName, baseDir); if (typeof mod === 'undefined') { gutil.log('Failed to load external module', gutil.colors.magenta(modName)); } }); } function getLocalBase(gulpFile) { return path.resolve(path.dirname(gulpFile)); } function findLocalGulp(gulpFile){ var baseDir = getLocalBase(gulpFile); return findLocalModule('gulp', baseDir); } function findLocalModule(modName, baseDir){ try { return require(resolve.sync(modName, {basedir: baseDir})); } catch(e) {} return; } function findLocalGulpPackage(gulpFile){ var baseDir = getLocalBase(gulpFile); var packageBase; try { packageBase = path.dirname(resolve.sync('gulp', {basedir: baseDir})); return require(path.join(packageBase, 'package.json')); } catch(e) {} return; } function loadGulpFile(localGulp, gulpFile, tasks){ var gulpFileCwd = path.dirname(gulpFile); process.chdir(gulpFileCwd); gutil.log('Working directory changed to', gutil.colors.magenta(gulpFileCwd)); var theGulpfile = require(gulpFile); // just for good measure process.nextTick(function(){ if (argv.tasks) { return logTasks(gulpFile, localGulp); } startGulp(localGulp, tasks); }); return theGulpfile; } function startGulp(localGulp, tasks) { // impose our opinion of "default" tasks onto orchestrator var toRun = tasks.length ? tasks : ['default']; return localGulp.start.apply(localGulp, toRun); } function logTasks(gulpFile, localGulp) { var tree = taskTree(localGulp.tasks); tree.label = 'Tasks for '+gutil.colors.magenta(gulpFile); archy(tree).split('\n').forEach(function(v){ if (v.trim().length === 0) return; gutil.log(v); }); } function getGulpFile() { var extensions; if (require.extensions) { extensions = Object.keys(require.extensions).join(','); } else { extensions = ['.js']; } var gulpFile = findup('gulpfile{'+extensions+'}', {cwd: cwd, nocase: true}); return gulpFile; } // format orchestrator errors function formatError (e) { if (!e.err) return e.message; if (e.err.message) return e.err.message; return JSON.stringify(e.err); } // wire up logging events function logEvents(gulp) { gulp.on('task_start', function(e){ gutil.log('Running', "'"+gutil.colors.cyan(e.task)+"'..."); }); gulp.on('task_stop', function(e){ var time = prettyTime(e.hrDuration); gutil.log('Finished', "'"+gutil.colors.cyan(e.task)+"'", 'in', gutil.colors.magenta(time)); }); gulp.on('task_err', function(e){ var msg = formatError(e); var time = prettyTime(e.hrDuration); gutil.log('Errored', "'"+gutil.colors.cyan(e.task)+"'", 'in', gutil.colors.magenta(time), gutil.colors.red(msg)); }); gulp.on('task_not_found', function(err){ gutil.log(gutil.colors.red("Task '"+err.task+"' was not defined in your gulpfile but you tried to run it.")); gutil.log('Please check the documentation for proper gulpfile formatting.'); process.exit(1); }); }