web-dev-qa-db-ja.com

GruntでのNodemonのようなタスク:ノードプロセスを実行して監視する

何かが足りないような気がします。

これが私が達成したいことです:

server.jsを実行し、watchタスクを並行して実行する不快なタスクがあります。これは、うなり声が設計されたタスクの1つであるように感じますが、この構成を実現できません。

他の人の間で、私はこれを読みました: 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"[email protected]よりも高いバージョンである必要があります。

適切な構成を実現するためにご協力いただければ、大変感謝しています。しかし、より一般的には、公式のgrunt-contrib-nodemon-likeパッケージとタスクがない理由がわかりません。これは、gruntを使用するもう1つの大きな理由(ツールとして本当に気に入っている)だと感じているためです。

ありがとう

28

編集: grunt-nodemon

これを書いてから、ニースの人がそれを開発しました。


Grunt.util.spawnを使用して新しいプロセスを起動するのに多くの問題がありました。実行されますが、出力は返されません。おそらく、これらのドキュメントで私ができなかったことを理解できるでしょう。 http://gruntjs.com/api/grunt.util#grunt.util.spawn

あなたが持っているもので私が見る2つの問題:

  • タスクを実行するためにコールバック関数を使用するとき、grunt.registerTask()は3つの引数を取る必要があると思います。
  • ファイルが変更されるたびに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');
});

これにより、少なくともファイルが初めて変更されたときにwatchnode server.jsを実行する可能性があります。

これが代わりに私がすることです。

Nodemon $ nodemon server.jsをそのまま使用するか、

または...

ソースを読み取って grunt-developを使用します

彼はサーバーを子プロセスとして管理しており、あなたが探しているものかもしれません。

または...

Get 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

それがお役に立てば幸いです。幸運を!

27
nackjicholson

こんにちは私もこの問題に遭遇しました。ここに私の解決策があります(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' ]);
    
    });
    
2
roo2

グラントコンカレントを使用する

問題は、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
        }
      }
    }
  });
};

2つは幸せに並んで実行されます。

1
superluminary