28

我觉得我错过了什么。

这是我想要实现的目标:

有一个执行我的任务并并行server.js运行watch任务。我觉得这正是 grunt 设计的任务之一,但我无法实现这种配置。

其中,我读过这篇文章: Running Node app through Grunt but I still can't make it。

这是我的 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 的另一个重要原因(我真的很喜欢它作为一个工具!)

谢谢

4

3 回答 3

27

编辑:咕噜-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 server.js要么按原样使用 nodemon

或者...

阅读源代码并使用grunt-develop

他将服务器作为子进程进行管理,这可能是您正在寻找的。

或者...

获取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

我真诚地希望这会有所帮助。祝你好运!

于 2013-03-10T07:30:15.713 回答
2

嗨,我也遇到了这个问题,这是我的解决方案(基于 nackjicholson 的回答)。这在衍生进程中使用了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' ]);
    
    });
    
于 2013-11-26T13:21:23.407 回答
1

使用 grunt 并发

问题是像 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
        }
      }
    }
  });
};

现在,两人将愉快地并肩奔跑。

于 2014-12-18T22:20:08.863 回答