Подтвердить что ты не робот

Задача Nodemon в Grunt: выполнить node процесс и посмотреть

Мне кажется, что я что-то пропустил.

Вот чего я хочу достичь:

Имея задачу grunt, которая выполняет мой server.js и запускает задачу watch параллельно. Мне кажется, что это именно одна из задач, которые были решены, но я не могу достичь этой конфигурации.

В частности, я прочел следующее: Запуск приложения Node через 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", который должен быть более высокой версии, чем [email protected], как в предыдущем сообщении.

Если бы вы могли помочь мне достичь надлежащей конфигурации, я был бы чрезвычайно благодарен. Но в целом я не понимаю, почему нет официального пакета grunt-contrib-nodemon-like и задачи, поскольку у меня есть ощущение, что это будет еще одна отличная причина для использования grunt (что мне действительно нравится как инструмент!)

Спасибо

4b9b3361

Ответ 1

Изменить: 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 as is

или...

Прочитайте исходный код и используйте 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

Я искренне надеюсь, что это поможет. Удачи!

Ответ 2

Привет, я также столкнулся с этой проблемой, и вот мое решение (основано на ответе nackjicholson). Это использует grunt-nodemon в порожденном процессе. поэтому я могу:

  • Обновить nodejs
  • Следите за изменениями, например..less files
  • Получить выходные данные обеих задач

    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-concurrent

Проблема в том, что такие задачи, как watch и nodemon, никогда не прекратятся, поэтому хрюканье никогда не достигнет их. Вам нужно создать новый процесс.

Вы можете сделать это легко, используя grunt-concurrent:

https://github.com/sindresorhus/grunt-concurrent

Например:

module.exports = function(grunt) {
  grunt.initConfig({

    ...

    concurrent: {
      dev: {
        tasks: ['nodemon', 'watch'],
        options: {
          logConcurrentOutput: true
        }
      }
    }
  });
};

Теперь они будут работать счастливо бок о бок.