2013-02-23 13 views
13

ノードアプリケーションをグランタタスクとして実行しようとしています。私は子プロセスとしてこれを生成する必要がありますが、私には並列タスクを実行させることができます。グランツ経由のノードアプリの実行

これは動作します:

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

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

変更は時計タスクによって検出された場合しかし、これが再び開始タスクをトリガーします。私のNodeアプリケーションの別の子プロセスを生成する前に、前のものを強制終了する必要があります。

ただし、プロセスを強制終了する方法を理解できません。このような何かが動作しません:私は、関数コンテキストの外側の変数で作成されたプロセスを格納していても、それが持続しない

  1. ので、次の時間:

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

    と思われます開始タスクが実行され、子はundefinedです。

  2. childgrunt-contrib-watchは現在、子プロセスとして、すべてのタスクの実行を生成しますので、これはある...

答えて

4

を一切kill機能を持っていません。したがって、変数childは同じプロセスコンテキスト内にありません。まもなく、[email protected]nospawnオプションでリリースされます。これにより、同じコンテキスト内でタスクが実行されるようにウォッチを設定できるようになり、上記の例が有効になります。

は少し詳細については、この問題を見てみましょう:

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

+0

私は 'grunt-contrib-watch'モジュールを[nospawn](https://github.com/gruntjs/grunt-contrib-watch/tree/nospawn)ブランチに置き換え、' nospawn'を設定しました。オプションをtrueに設定します:https://gist.github.com/OliverJAsh/5021187。 'child'は2番目の関数呼び出しでまだ定義されていません。また、どのように私は子供のプロセスを殺すことができるか知っていますか? –

+0

Gruntfileはjsonファイルではなく、jsファイルのみです。 grunt.task.run()でwatchタスクを呼び出す必要もありません。時計を使用してコンテキストを共有する例を次に示します。https://github.com/gruntjs/grunt-contrib-watch/blob/nospawn/test/fixtures/nospawn/Gruntfile.js#L35 –

+1

子プロセスを強制終了するには、次の操作を行います。 'child.kill( 'SIGINT');' –

5

は、子プロセスを生成に関連した頭痛の多くを扱うgrunt-nodemonを見てみましょう。

関連する問題