13

NodeアプリケーションをGruntタスクとして実行しようとしています。ただし、監視タスクを並行して実行できるようにするには、これを子プロセスとして生成する必要があります。

これは機能します:

grunt.registerTask('start', function () {
  grunt.util.spawn(
    { cmd: 'node'
    , args: ['app.js']
    })

  grunt.task.run('watch:app')
})

ただし、監視タスクによって変更が検出されると、これにより開始タスクが再度トリガーされます。Nodeアプリの別の子プロセスを生成する前に、前のプロセスを強制終了する必要があります。

ただし、プロセスを強制終了する方法がわかりません。このようなものは機能しません:

var child

grunt.registerTask('start', function () {
  if (child) child.kill()
  child = grunt.util.spawn(
    { cmd: 'node'
    , args: ['app.js']
    })

  grunt.task.run('watch:app')
})

次のように見えます。

  1. 生成されたプロセスを関数コンテキスト外の変数に格納しても、それは永続化されないため、次に開始タスクが実行されるとき、子はundefinedです。
  2. child機能はありませんkill…</li>
4

2 に答える 2

5

子プロセスの生成に関連する多くの頭痛の種を処理するgrunt-nodemonを見てください。

于 2013-11-05T03:39:53.573 に答える
4

これは、grunt-contrib-watch現在、すべてのタスク実行が子プロセスとして生成されるためです。したがって、変数childは同じプロセスコンテキスト内にありません。かなり間もなく、オプション付きgrunt-contrib-watch@0.3.0でリリースされnospawnます。これにより、同じコンテキスト内で実行されるタスクを生成するようにウォッチを構成でき、上記の例が機能するようになります。

もう少し詳しい情報については、この問題をご覧ください。

https://github.com/gruntjs/grunt-contrib-watch/issues/45

于 2013-02-23T20:08:01.483 に答える