Grunt 中类似 Nodemon 的任务:执行节点进程并观察
Posted
技术标签:
【中文标题】Grunt 中类似 Nodemon 的任务:执行节点进程并观察【英文标题】:Nodemon-like task in Grunt : execute node process and watch 【发布时间】:2013-02-20 05:24:27 【问题描述】:我觉得我错过了什么。
这是我想要实现的目标:
有一个执行我的 server.js
并并行运行 watch
任务的 grunt 任务。在我看来,这正是 grunt 设计的任务之一,但我无法实现这种配置。
除其他外,我读过这个: Running Node app through Grunt 但我还是做不到。
这是我的 Gruntfile.js :
module.exports = function(grunt)
// Project configuration.
grunt.initConfig(
watch:
scripts:
files: ['*.js'],
tasks: ['start'],
options:
nospawn: true
);
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('start', function()
grunt.util.spawn(
cmd: 'node',
args: ['server.js']
);
grunt.task.run('watch');
);
grunt.registerTask('default', 'start');
;
我有"grunt-contrib-watch": "~0.3.1"
,它的版本应该比前面提到的帖子中的grunt-contrib-watch@0.3.0
更高。
如果您能帮助我实现正确的配置,我将不胜感激。但更一般地说,我不明白为什么没有官方的 grunt-contrib-nodemon-like
包和任务,因为我觉得这将是使用 grunt 的另一个重要原因(我真的很喜欢它作为一个工具!)
谢谢
【问题讨论】:
【参考方案1】:使用 grunt-concurrent
问题是像 watch 和 nodemon 这样的任务永远不会终止,所以 grunt 永远不会到达它们。您需要生成一个新进程。
您可以使用 grunt-concurrent 轻松做到这一点:
https://github.com/sindresorhus/grunt-concurrent
例如:
module.exports = function(grunt)
grunt.initConfig(
...
concurrent:
dev:
tasks: ['nodemon', 'watch'],
options:
logConcurrentOutput: true
);
;
现在两人将愉快地并肩奔跑。
【讨论】:
特别是使用 logConcurrentOutput 选项,这可以满足我的需求并且非常容易实现。谢谢。【参考方案2】:您好,我也遇到了这个问题,这是我的解决方案(基于 nackjicholson 的回答)。这在spawned process 中使用grunt-nodemon。所以我可以:
重新加载nodejs 注意更改,例如.less 文件获取两个任务的输出
grunt.loadNpmTasks('grunt-nodemon');
grunt.initConfig(
nodemon:
dev:
options:
file: 'server.js',
nodeArgs: ['--debug'],
env:
PORT: '8282'
,
);
grunt.registerTask('server', function (target)
// Running nodejs in a different process and displaying output on the main console
var nodemon = grunt.util.spawn(
cmd: 'grunt',
grunt: true,
args: 'nodemon'
);
nodemon.stdout.pipe(process.stdout);
nodemon.stderr.pipe(process.stderr);
// here you can run other tasks e.g.
// grunt.task.run([ 'watch' ]);
);
【讨论】:
【参考方案3】:编辑:grunt-nodemon
自从写了这篇文章后,一个好人开发了它。
我在使用 grunt.util.spawn 启动新进程时遇到了很多麻烦。他们会跑,但他们不会给我任何输出。也许您可以弄清楚我在这些文档中无法解决的问题。 http://gruntjs.com/api/grunt.util#grunt.util.spawn
我看到你所拥有的两个问题:
我认为当您使用回调函数运行任务时,grunt.registerTask() 必须采用三个参数。 我认为您不能在每次文件更改时一遍又一遍地致电node server.js
。它将在第一次运行,要真正运行,您必须将服务器作为子进程进行管理,在后续文件更改时终止并重新启动它。
对于 registerTask 参数,试试这个,看看你是否可以在你当前的实现中得到一些工作。
http://gruntjs.com/api/grunt.task#grunt.task.registertask
像这样需要(taskName, description, taskFunction)
:
grunt.registerTask('start', 'My start task description', function()
grunt.util.spawn(
cmd: 'node',
args: ['server.js']
);
grunt.task.run('watch');
);
这至少可以让您的watch
在文件第一次更改时运行node server.js
。
这就是我要做的。
要么按原样使用 nodemon $ nodemon server.js
或者...
阅读源码并使用grunt-develop
他将服务器作为子进程进行管理,可能就是您要找的。p>
或者...
获取grunt-shellnpm install grunt-shell --save-dev
并用它为你运行 nodemon:
module.exports = function(grunt)
// Project configuration.
grunt.initConfig(
serverFile: 'server.js',
shell:
nodemon:
command: 'nodemon <%= serverFile %>',
options:
stdout: true,
stderr: true
,
watch: /* nothing to do in watch anymore */
);
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-shell');
grunt.registerTask('default', 'shell:nodemon');
;
$ grunt shell:nodemon
我真诚地希望这会有所帮助。祝你好运!
【讨论】:
非常感谢您的帮助! Grunt develop 几乎就是我想要的。虽然我仍然认为 Grunt 团队为其创建一个 contrib 包会很有用。 :) 我相信 grunt-contrib-livereload 是他们的解决方案。我对那个插件一点经验都没有,但乍一看好像$ grunt livereload-start
设置了你的服务器。
我认为livereload
中的服务器只是为了通过websockets重新加载资产,应该分开。不过可能是错的。
谢谢奥利弗。无视上面那条评论。也许我应该删除它。但是看起来你没有和任何人说话。以上是关于Grunt 中类似 Nodemon 的任务:执行节点进程并观察的主要内容,如果未能解决你的问题,请参考以下文章
grunt-nodemon 没有使用 nodemon 来启动服务器
Express 可以在使用虚拟主机时运行 Gulp 或 Grunt 任务吗?