使用grunt运行节点服务器并在之后进行清理

时间:2014-03-17 11:45:11

标签: node.js gruntjs

所以基本上这就是我想要做的。有一个将我的咖啡文件编译成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服务器。然后,在它完成之后,我想要咕噜声删除所述文件。

我怎样才能做到这一点?

修改:请注意,该代码段并未实施实际删除,因为我无法使其生效。

2 个答案:

答案 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']
    );
相关问题