所以基本上这就是我想要做的。有一个将我的咖啡文件编译成JS的grunt脚本。然后运行节点服务器,然后,在服务器关闭后或在它仍然运行时,删除作为编译结果的JS文件,只保留.coffee文件。
我有几个问题要让它发挥作用。最重要的是,我目前的做法是:
grunt.loadNpmTasks("grunt-contrib-coffee");
grunt.registerTask("node", "Starting node server", function () {
var done = this.async();
console.log("test");
var sp = grunt.util.spawn({
cmd: "node",
args: ["index"]
}, function (err, res, code) {
console.log(err, res, code);
done();
});
});
grunt.registerTask("default", ["coffee", "node"]);
这里的问题是节点服务器不在与grunt相同的进程中运行。这很重要,因为我不能只用CTRL-C来终止节点服务器。
理想情况下,我希望让它在同一个进程中运行,并让grunt脚本暂停,同时等待我按CTRL-C服务器。然后,在它完成之后,我想要咕噜声删除所述文件。
我怎样才能做到这一点?
修改:请注意,该代码段并未实施实际删除,因为我无法使其生效。
答案 0 :(得分:0)
如果将变量sp
保留在更全局的范围内,则可以定义一个任务node:kill
,它只检查sp === null
(或类似),如果不是,sp.kill()
node:kill
1}}。然后,您可以在测试任务后运行{{1}}任务。您还可以调用一个单独的任务,只删除生成的JS文件。
答案 1 :(得分:0)
对于类似的东西,我将grunt-shell-spawn与关机监听器结合使用。
在你的grunt initConfig中:
shell: {
runSuperCoolJavaServer:{
command:'java -jar mysupercoolserver.jar',
options: {
async:true //spawn it instead!
}
}
},
然后在initConfig之外,你可以设置一个监听器,用于当用户ctrl + c离开你的grunt任务时:
grunt.registerTask("superCoolServerShutdownListener",function(step){
var name = this.name;
if (step === 'exit') process.exit();
else {
process.on("SIGINT",function(){
grunt.log.writeln("").writeln("Shutting down super cool server...");
grunt.task.run(["shell:runSuperCoolJavaServer:kill"]); //the key!
grunt.task.current.async()();
});
}
});
最后,注册任务
grunt.registerTask('serverWithKill', [
'runSuperCoolJavaServer',
'superCoolServerShutdownListener']
);