index.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. 'use strict';
  2. var fs = require('fs');
  3. var path = require('path');
  4. var log = require('gulplog');
  5. var yargs = require('yargs');
  6. var Liftoff = require('liftoff');
  7. var interpret = require('interpret');
  8. var v8flags = require('v8flags');
  9. var findRange = require('semver-greatest-satisfied-range');
  10. var ansi = require('./lib/shared/ansi');
  11. var exit = require('./lib/shared/exit');
  12. var tildify = require('./lib/shared/tildify');
  13. var makeTitle = require('./lib/shared/make-title');
  14. var cliOptions = require('./lib/shared/cli-options');
  15. var completion = require('./lib/shared/completion');
  16. var verifyDeps = require('./lib/shared/verify-dependencies');
  17. var cliVersion = require('./package.json').version;
  18. var getBlacklist = require('./lib/shared/get-blacklist');
  19. var toConsole = require('./lib/shared/log/to-console');
  20. var loadConfigFiles = require('./lib/shared/config/load-files');
  21. var mergeConfigToCliFlags = require('./lib/shared/config/cli-flags');
  22. var mergeConfigToEnvFlags = require('./lib/shared/config/env-flags');
  23. // Logging functions
  24. var logVerify = require('./lib/shared/log/verify');
  25. var logBlacklistError = require('./lib/shared/log/blacklist-error');
  26. // Get supported ranges
  27. var ranges = fs.readdirSync(__dirname + '/lib/versioned/');
  28. // Set env var for ORIGINAL cwd
  29. // before anything touches it
  30. process.env.INIT_CWD = process.cwd();
  31. var cli = new Liftoff({
  32. name: 'gulp',
  33. processTitle: makeTitle('gulp', process.argv.slice(2)),
  34. completions: completion,
  35. extensions: interpret.jsVariants,
  36. v8flags: v8flags,
  37. configFiles: {
  38. '.gulp': {
  39. home: {
  40. path: '~',
  41. extensions: interpret.extensions,
  42. },
  43. cwd: {
  44. path: '.',
  45. extensions: interpret.extensions,
  46. },
  47. },
  48. },
  49. });
  50. var usage =
  51. '\n' + ansi.bold('Usage:') +
  52. ' gulp ' + ansi.blue('[options]') + ' tasks';
  53. var parser = yargs.usage(usage, cliOptions);
  54. var opts = parser.argv;
  55. // Set up event listeners for logging temporarily.
  56. toConsole(log, opts);
  57. cli.on('require', function(name) {
  58. log.info('Requiring external module', ansi.magenta(name));
  59. });
  60. cli.on('requireFail', function(name) {
  61. log.error(ansi.red('Failed to load external module'), ansi.magenta(name));
  62. });
  63. cli.on('respawn', function(flags, child) {
  64. var nodeFlags = ansi.magenta(flags.join(', '));
  65. var pid = ansi.magenta(child.pid);
  66. log.info('Node flags detected:', nodeFlags);
  67. log.info('Respawned to PID:', pid);
  68. });
  69. function run() {
  70. cli.launch({
  71. cwd: opts.cwd,
  72. configPath: opts.gulpfile,
  73. require: opts.require,
  74. completion: opts.completion,
  75. }, handleArguments);
  76. }
  77. module.exports = run;
  78. // The actual logic
  79. function handleArguments(env) {
  80. var cfgLoadOrder = ['home', 'cwd'];
  81. var cfg = loadConfigFiles(env.configFiles['.gulp'], cfgLoadOrder);
  82. opts = mergeConfigToCliFlags(opts, cfg);
  83. env = mergeConfigToEnvFlags(env, cfg);
  84. // This translates the --continue flag in gulp
  85. // To the settle env variable for undertaker
  86. // We use the process.env so the user's gulpfile
  87. // Can know about the flag
  88. if (opts.continue) {
  89. process.env.UNDERTAKER_SETTLE = 'true';
  90. }
  91. // Set up event listeners for logging again after configuring.
  92. toConsole(log, opts);
  93. if (opts.help) {
  94. parser.showHelp(console.log);
  95. exit(0);
  96. }
  97. if (opts.version) {
  98. log.info('CLI version', cliVersion);
  99. if (env.modulePackage && typeof env.modulePackage.version !== 'undefined') {
  100. log.info('Local version', env.modulePackage.version);
  101. }
  102. exit(0);
  103. }
  104. if (opts.verify) {
  105. var pkgPath = opts.verify !== true ? opts.verify : 'package.json';
  106. if (path.resolve(pkgPath) !== path.normalize(pkgPath)) {
  107. pkgPath = path.join(env.cwd, pkgPath);
  108. }
  109. log.info('Verifying plugins in ' + pkgPath);
  110. return getBlacklist(function(err, blacklist) {
  111. if (err) {
  112. return logBlacklistError(err);
  113. }
  114. var blacklisted = verifyDeps(require(pkgPath), blacklist);
  115. logVerify(blacklisted);
  116. });
  117. }
  118. if (!env.modulePath) {
  119. log.error(
  120. ansi.red('Local gulp not found in'),
  121. ansi.magenta(tildify(env.cwd))
  122. );
  123. log.error(ansi.red('Try running: npm install gulp'));
  124. exit(1);
  125. }
  126. if (!env.configPath) {
  127. log.error(ansi.red('No gulpfile found'));
  128. exit(1);
  129. }
  130. // Chdir before requiring gulpfile to make sure
  131. // we let them chdir as needed
  132. if (process.cwd() !== env.cwd) {
  133. process.chdir(env.cwd);
  134. log.info(
  135. 'Working directory changed to',
  136. ansi.magenta(tildify(env.cwd))
  137. );
  138. }
  139. // Find the correct CLI version to run
  140. var range = findRange(env.modulePackage.version, ranges);
  141. if (!range) {
  142. return log.error(
  143. ansi.red('Unsupported gulp version', env.modulePackage.version)
  144. );
  145. }
  146. // Load and execute the CLI version
  147. require(path.join(__dirname, '/lib/versioned/', range, '/'))(opts, env, cfg);
  148. }