123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
- 'use strict';
- // Nodejs libs.
- var path = require('path');
- // This allows grunt to require() .coffee files.
- require('coffee-script');
- // The module to be exported.
- var grunt = module.exports = {};
- // Expose internal grunt libs.
- function gRequire(name) {
- return grunt[name] = require('./grunt/' + name);
- }
- var util = require('grunt-legacy-util');
- grunt.util = util;
- grunt.util.task = require('./util/task');
- var Log = require('grunt-legacy-log').Log;
- var log = new Log({grunt: grunt});
- grunt.log = log;
- gRequire('template');
- gRequire('event');
- var fail = gRequire('fail');
- gRequire('file');
- var option = gRequire('option');
- var config = gRequire('config');
- var task = gRequire('task');
- var help = gRequire('help');
- gRequire('cli');
- var verbose = grunt.verbose = log.verbose;
- // Expose some grunt metadata.
- grunt.package = require('../package.json');
- grunt.version = grunt.package.version;
- // Expose specific grunt lib methods on grunt.
- function gExpose(obj, methodName, newMethodName) {
- grunt[newMethodName || methodName] = obj[methodName].bind(obj);
- }
- gExpose(task, 'registerTask');
- gExpose(task, 'registerMultiTask');
- gExpose(task, 'registerInitTask');
- gExpose(task, 'renameTask');
- gExpose(task, 'loadTasks');
- gExpose(task, 'loadNpmTasks');
- gExpose(config, 'init', 'initConfig');
- gExpose(fail, 'warn');
- gExpose(fail, 'fatal');
- // Expose the task interface. I've never called this manually, and have no idea
- // how it will work. But it might.
- grunt.tasks = function(tasks, options, done) {
- // Update options with passed-in options.
- option.init(options);
- // Display the grunt version and quit if the user did --version.
- var _tasks, _options;
- if (option('version')) {
- // Not --verbose.
- log.writeln('grunt v' + grunt.version);
- if (option('verbose')) {
- // --verbose
- verbose.writeln('Install path: ' + path.resolve(__dirname, '..'));
- // Yes, this is a total hack, but we don't want to log all that verbose
- // task initialization stuff here.
- grunt.log.muted = true;
- // Initialize task system so that available tasks can be listed.
- grunt.task.init([], {help: true});
- // Re-enable logging.
- grunt.log.muted = false;
- // Display available tasks (for shell completion, etc).
- _tasks = Object.keys(grunt.task._tasks).sort();
- verbose.writeln('Available tasks: ' + _tasks.join(' '));
- // Display available options (for shell completion, etc).
- _options = [];
- Object.keys(grunt.cli.optlist).forEach(function(long) {
- var o = grunt.cli.optlist[long];
- _options.push('--' + (o.negate ? 'no-' : '') + long);
- if (o.short) { _options.push('-' + o.short); }
- });
- verbose.writeln('Available options: ' + _options.join(' '));
- }
- return;
- }
- // Init colors.
- log.initColors();
- // Display help and quit if the user did --help.
- if (option('help')) {
- help.display();
- return;
- }
- // A little header stuff.
- verbose.header('Initializing').writeflags(option.flags(), 'Command-line options');
- // Determine and output which tasks will be run.
- var tasksSpecified = tasks && tasks.length > 0;
- tasks = task.parseArgs([tasksSpecified ? tasks : 'default']);
- // Initialize tasks.
- task.init(tasks);
- verbose.writeln();
- if (!tasksSpecified) {
- verbose.writeln('No tasks specified, running default tasks.');
- }
- verbose.writeflags(tasks, 'Running tasks');
- // Handle otherwise unhandleable (probably asynchronous) exceptions.
- var uncaughtHandler = function(e) {
- fail.fatal(e, fail.code.TASK_FAILURE);
- };
- process.on('uncaughtException', uncaughtHandler);
- // Report, etc when all tasks have completed.
- task.options({
- error: function(e) {
- fail.warn(e, fail.code.TASK_FAILURE);
- },
- done: function() {
- // Stop handling uncaught exceptions so that we don't leave any
- // unwanted process-level side effects behind. There is no need to do
- // this in the error callback, because fail.warn() will either kill
- // the process, or with --force keep on going all the way here.
- process.removeListener('uncaughtException', uncaughtHandler);
- // Output a final fail / success report.
- fail.report();
- if (done) {
- // Execute "done" function when done (only if passed, of course).
- done();
- } else {
- // Otherwise, explicitly exit.
- util.exit(0);
- }
- }
- });
- // Execute all tasks, in order. Passing each task individually in a forEach
- // allows the error callback to execute multiple times.
- tasks.forEach(function(name) { task.run(name); });
- // Run tasks async internally to reduce call-stack, per:
- // https://github.com/gruntjs/grunt/pull/1026
- task.start({asyncDone:true});
- };
|