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 任务吗?

grunt-nodemon参数配置

带有 grunt-nodemon、watch 和 jshint 的 Gruntjs

Gulp Watch 和 Nodemon 冲突

将Grunt更新用于自定义任务