Grunt任务等待退出

时间:2014-02-21 00:07:05

标签: javascript gruntjs build-automation

我有一个启动IIS Express异步的任务,并且要停止IIS我必须触发一个grunt事件。

我想做一个等待直到我按ctrl-c然后触发该事件的任务。

我试过这样做:

grunt.registerTask("killiis", function(){
    process.stdin.resume();
    var done = this.async();
    grunt.log.writeln('Waiting...');    

    process.on('SIGINT', function() {
        grunt.event.emit('iis.kill');
        grunt.log.writeln('Got SIGINT.  Press Control-D to exit.');
        done();
    });
});

该任务成功停止了grunt,但没有正确发送事件。

2 个答案:

答案 0 :(得分:3)

SIGINT处理程序在Node.js中工作,但不在Grunt中工作(我不知道为什么)。我使用ctrl+c模块手动处理readline并收听exit事件:

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on('SIGINT', function() {
  process.emit('SIGINT');
});

process.on('exit', killIis);

function killIis() {
  // kill it
}

此外,我建议收听SIGINTSIGHUPSIGBREAK信号以处理控制台窗口关闭或ctrl+break(如果有人使用它,嘿)。当您还要停止应用时,请在这些处理程序中调用process.exit()

process.on('exit', killIis);
process.on('SIGINT', killIisAndExit);
process.on('SIGHUP', killIisAndExit);
process.on('SIGBREAK', killIisAndExit);

我有一个grunt-iisexpress的分支在退出时杀死了IIS:https://github.com/whyleee/grunt-iisexpress

答案 1 :(得分:0)

我尝试了whyleee的建议,但我发现grunt在关闭之前没有等待清理过程退出。

我的解决方案基于this article

module.exports = function(grunt) {
  var exec, readline, shuttingDown, stdInterface;
  shuttingDown = false;
  readline = require("readline");
  exec = require("child_process").exec;
  // other grunt requires / task loads, including a "cleanup" task ...
  stdInterface = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  stdInterface.on("SIGINT", function() {
    var child;
    if (shuttingDown) {
      return;
    }
    shuttingDown = true;
    console.info("Cleaning up ...");
    child = exec("grunt cleanup", function(err, stdout, stderr) {
      console.info(stdout);
      process.exit(err ? 1 : 0);
    });
  });
  // other grunt config ...
};