Gruntjs 是否可以在监视任务之后运行任务?

Gruntjs 是否可以在监视任务之后运行任务?,gruntjs,grunt-contrib-watch,Gruntjs,Grunt Contrib Watch,我有一个基于PHP的项目,它不会在上运行。相反,我使用运行MAMP服务器进行开发 exec: { serverup: { command: '/Applications/MAMP/bin/start.sh' }, serverdown: { command: '/Applications/MAMP/bin/stop.sh' } } 在自定义开发任务中,我在监视任务之前运行MAMP启动脚本。然后,我试图在退出监视任务后停止MAMP服务器 grunt.registe

我有一个基于PHP的项目,它不会在上运行。相反,我使用运行MAMP服务器进行开发

exec: {
  serverup: {
    command: '/Applications/MAMP/bin/start.sh'
  },
  serverdown: {
    command: '/Applications/MAMP/bin/stop.sh'
  }
}
在自定义开发任务中,我在监视任务之前运行MAMP启动脚本。然后,我试图在退出监视任务后停止MAMP服务器

grunt.registerTask('default', ['jshint', 'concat', 'compass:dev', 'exec:serverup', 'watch', 'exec:serverdown']);
但是,如果使用Ctrl-C退出任务,则
exec:serverdown
任务似乎永远不会运行。有什么办法可以让这一切顺利进行吗?由于服务器从不停机,因此在手动运行停止脚本之前,该端口一直处于阻塞状态,如果在停机之前再次尝试运行默认任务,则会出现错误


如果没有,还有其他方法可以完成同样的任务吗?

您可以收听
SIGINT
并运行脚本:

var exec = require('child_process').exec;
process.on('SIGINT', function () {
    exec('/Applications/MAMP/bin/stop.sh', function () {
        process.exit();
    });
});

module.exports = function (grunt) {};

谢谢你的回答。看起来很有希望。我将很快试用并报告。我遇到了一些问题。我不确定这应该放在我的Gruntfile中的什么地方。如果我将它包含在
module.exports=function(grunt){…}
中,我将无法再使用Ctrl-C结束任务。如果我将它放在该函数之外,我将得到
致命错误:grunt未定义
。这允许我退出任务,但当所有操作都完成后,服务器仍处于运行状态。我可以手动运行
grunt exec:serverdown
,服务器确实会停机。似乎grunt.task.run是异步的,没有回调,这使得它在能够运行任务之前运行process.exit()。我已经用另一个解决方案更新了答案。你介意分享一下为什么它不能与grunt php一起使用吗?@SindreSorhus我不太清楚。我正在为你设计一个主题。我开始尝试使用grunt php,但无法完成安装。我在Koken论坛上发了帖子,一个开发人员告诉我,它不能与内置的PHP服务器一起工作,而grunt PHP显然就是这么用的。他没有说为什么。