28

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

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

server.jsmyを実行し、watchタスクを並行して実行するgruntタスクがあります。これはまさにgruntが設計されたタスクの1つであると私には感じますが、この構成を実現することはできません。

とりわけ、私はこれを読みました: 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、うなり声を使用するもう1つの大きな理由になると感じているからです(これはツールとして本当に好きです!)

ありがとう

4

3 に答える 3

27

編集: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');
});

これにより、少なくともファイルが最初に変更されたときwatchに実行できるようになる可能性がありnode server.jsます。

代わりにこれを行います。

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

また...

ソースを読み、grunt-developを使用します

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

また...

うなり声を上げる
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-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
        }
      }
    }
  });
};

これで、2つは一緒に楽しく実行されます。

于 2014-12-18T22:20:08.863 に答える