Задача 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 (что мне действительно нравится как инструмент!)
Спасибо
Ответы
Ответ 1
после написания этого, хороший человек разработал это.
У меня возникли проблемы с использованием 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
}
}
}
});
};
Теперь они будут работать счастливо бок о бок.