2013-04-24 60 views
16

我目前正在尝试执行几个步骤,需要将任务产生到子进程中。例如:当Grunt退出时杀死产生的进程

  1. 观看文件
  2. 启动我的静态网站生成的预览服务器

,我可以很容易地使用一个任务,如grunt-concurrent有这两个同时运行。但是,当我退出grunt时,子进程(在这种情况下 - 我使用grunt-shell运行的静态站点生成器)继续运行。我想让这些任务同时运行 - 但是也会让他们在咕噜声退出时被杀死。

想法?

回答

0

有没有理由不使用grunt-contrib-connect来启动项目根目录中的服务器?

如果有可能做到这一点,而不是使用咕噜壳,服务器将自动关闭,当你的咕噜过程出来

+0

伟大的一点 - 但不幸的没有。我正在使用Wintersmith作为我的站点生成器(它使用Connect服务器) - 但我想避免必须复制该预览服务器的逻辑。 – dtuckernet 2013-05-08 01:32:05

1

不知道这是如何工作与咕噜壳。但是,如果你想建立一个自定义的咕噜任务运行服务器,你可以尝试财产以后这样的:

var spawn = require('child_process').spawn; 
    var server = spawn('myserver', ['--foo']); 
    process.on('exit', function() { 
    grunt.log.writeln('killing myserver...'); 
    server.kill(); 
    grunt.log.writeln('killed myserver'); 
    }); 
+1

不幸的是,我尝试过没有成功(没有写入消息或服务器被终止)。 – Pat 2014-03-26 20:54:08

+0

这是我口味最好的答案。简单,直截了当。没有学习曲线..如果事情很简单,我真的不支持使用库。从技术上讲,grunt shell插件应该在内部完成。一个简单的小姐。 – 2015-05-10 11:42:37

0

显然,grunt-shell不处理process退出事件:https://github.com/sindresorhus/grunt-shell/blob/master/tasks/shell.js

因此,我怀疑你的咕噜进程退出和grunt-shell从不警告它的父进程正在停止子进程。

例如,grunt-concurrent确实杀死其子进程,因为我们可以在这里看到:

process.on('exit', function() { 
    cpCache.forEach(function (el) { 
     el.kill(); 
    }); 
}); 

来源:https://github.com/sindresorhus/grunt-concurrent/blob/master/tasks/concurrent.js#L55

因此,使用grunt-shell不会为你工作。

一个解决方案是在您的Gruntfile中需要wintersmith并在自定义任务中以编程方式运行它。