我有启动服务器的繁琐任务:
module.exports = function(grunt){
grunt.registerMultiTask('connect', 'Run a simple Node Server', function(){
var options = this.options();
// Tell Grunt this task is asynchronous.
var done = this.async();
var server = connect();
server.use(function(request, response, nxt){
...
});
server.listen(port);
});
};
现在我想先使用grunt启动这个节点服务器,然后使用grunt-open插件打开浏览器。
grunt.task.run(['startServer', 'open']);
但是当服务器继续监听时,startServer任务阻止打开任务。如何在服务器启动后保持此节点服务器运行并打开浏览器?
答案 0 :(得分:1)
我和你的问题一样,我在Windows环境中工作过。我的解决方案是将Web服务器代码放在一个文件中,例如myServer.js,并在grunt-exec设置中使用cmd: "start node \"path\to\myServer.js"
。
示例:强>
假设我的服务器文件位于以下路径:D:\SourceCodes\WebServer\myServer.js
我的服务器的IP地址和端口是192.168.1.1:8080
,
我的网页是index.html
然后Gruntfile.js将是:
module.exports = function (grunt) {
grunt.initConfig({
exec: {
run_server:{
cwd: "D:/SourceCodes/WebServer/",
cmd: "start node \"D:/SourceCodes/WebServer/myServer.js\""
},
open_web:{
cmd: "start chrome http://192.168.1.1:8080/index.html"
}
});
grunt.loadNpmTasks('grunt-exec');
grunt.registerTask('default', ['exec']);
}
答案 1 :(得分:0)
两件事:
你的'connect'任务当前在等待时阻塞,你必须告诉它让grunt进程异步运行:在最后调用done()
...
server.listen(port);
done();
});
现在您的构建将在任务列表的末尾结束,并使用它取下您的服务器。所以你必须添加一个任务来保持它的活力。我建议使用grunt-contrib-watch
,但您可以选择任何您喜欢的,只要它是阻止任务:
grunt.task.run(['startServer', 'open', 'watch]);
顺便问一下,为什么要调用grunt.task.run而不是定义自己的任务序列grunt.registerTask('default', ['startServer', 'open', 'watch]);
?