grunt-develop
Version:
Run a Node.js application for development, with support for auto-reload.
91 lines (80 loc) • 2.58 kB
JavaScript
/*
* @module grunt-develop
* @author Edward Hotchkiss <edward@edwardhotchkiss.com>
* @description http://github.com/edwardhotchkiss/grunt-develop/
* @license MIT
*/
;
module.exports = function(grunt) {
var child
, running = false
, fs = require('fs')
, util = require('util');
// kills child process (server)
grunt.event.on('develop.kill', function() {
grunt.log.warn('kill process');
child.kill('SIGKILL');
});
// spawned, notify grunt to move onto next task
grunt.event.on('develop.started', function() {
setTimeout(function() {
global.gruntDevelopDone();
}, 250);
});
// starts server
grunt.event.on('develop.start', function(filename, nodeArgs, args, env, cmd) {
var spawnArgs = nodeArgs.concat([filename], args);
if (running) {
return grunt.event.emit('develop.kill');
}
child = grunt.util.spawn({
cmd: cmd,
args: spawnArgs,
opts: {
env: env
}
}, function(){});
// handle exit
child.on('exit', function(code, signal) {
running = false;
if (signal !== null) {
grunt.log.warn(util.format('application exited with signal %s', signal));
} else {
grunt.log.warn(util.format('application exited with code %s', code));
}
if (signal === 'SIGKILL') {
grunt.event.emit('develop.start', filename, nodeArgs, args, env, cmd);
}
});
child.stderr.on('data', function(buffer) {
if (buffer.toString().trim().length) {
grunt.log.write('\r\n[grunt-develop] > '.red + buffer.toString());
}
});
child.stdout.on('data', function (buffer) {
grunt.log.write('\r\n[grunt-develop] > '.cyan + buffer.toString());
});
running = true;
grunt.log.write('\r\n[grunt-develop] > '.cyan + util.format('started application "%s".', filename));
grunt.event.emit('develop.started');
});
// TASK. perform setup
grunt.registerMultiTask('develop', 'init', function() {
var filename = this.data.file
, nodeArgs = this.data.nodeArgs || []
, args = this.data.args || []
, env = this.data.env || process.env || {}
, cmd = this.data.cmd || process.argv[0];
if (!grunt.file.exists(filename)) {
grunt.fail.warn(util.format('application file "%s" not found!', filename));
return false;
}
global.gruntDevelopDone = this.async();
grunt.event.emit('develop.start', filename, nodeArgs, args, env, cmd);
});
process.on('exit', function() {
if (running) {
child.kill('SIGINT');
}
});
};