【问题标题】:Nodemon-like task in Grunt : execute node process and watchGrunt 中类似 Nodemon 的任务:执行节点进程并观察
【发布时间】: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 的另一个重要原因(我真的很喜欢它作为一个工具!)

谢谢

【问题讨论】:

    标签: node.js gruntjs watch spawn


    【解决方案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-shell
      npm 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重新加载资产,应该分开。不过可能是错的。
      • 谢谢奥利弗。无视上面那条评论。也许我应该删除它。但是看起来你没有和任何人说话。
      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 2015-07-25
      • 2018-01-04
      • 2019-04-04
      • 1970-01-01
      • 2014-06-02
      • 2014-04-16
      • 1970-01-01
      相关资源
      最近更新 更多