2013-02-23 32 views
13

Tôi đang cố gắng chạy ứng dụng Nút của tôi dưới dạng tác vụ Grunt. Tuy nhiên, tôi cần phải sinh ra điều này như là một tiến trình con, để cho phép tôi chạy tác vụ đồng hồ song song.Chạy ứng dụng Node thông qua Grunt

này hoạt động:

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

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

Tuy nhiên, khi thay đổi được phát hiện bởi các nhiệm vụ theo dõi, điều này sẽ kích hoạt các nhiệm vụ bắt đầu một lần nữa. Trước khi tôi sinh ra một tiến trình con khác của ứng dụng Node của tôi, tôi cần phải giết nó trước đó.

Tôi không thể tìm ra cách để hủy quy trình. Một cái gì đó như thế này không hoạt động:

var child 

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

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

Dường như:

  1. Mặc dù tôi lưu trữ các quá trình sinh ra trong một biến bên ngoài bối cảnh chức năng, nó không tồn tại, vì vậy trong thời gian tới nhiệm vụ bắt đầu được chạy, con là undefined.
  2. child không có kill chức năng ...

Trả lời

4

Điều này là do grunt-contrib-watch hiện spawns tất cả các nhiệm vụ chạy như tiến trình con. Vì vậy, biến child không nằm trong cùng một ngữ cảnh quy trình. Khá sớm, [email protected] sẽ được phát hành với tùy chọn nospawn. Điều này sẽ cho phép bạn cấu hình đồng hồ để sinh ra nhiệm vụ chạy trong cùng một bối cảnh và sẽ làm cho ví dụ trên của bạn làm việc.

Hãy nhìn vào vấn đề này để biết thêm một chút thông tin:

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

+0

Tôi vừa thay thế mô-đun 'grunt-contrib-watch' của mình bằng nhánh [nospawn] (https://github.com/gruntjs/grunt-contrib-watch/tree/nospawn) và đặt 'nospawn' tùy chọn đúng: https://gist.github.com/OliverJAsh/5021187. 'child' vẫn chưa được xác định trong lần gọi hàm thứ hai. Ngoài ra, bạn có biết làm thế nào tôi có thể giết chết quá trình con? –

+0

Gruntfile không phải là tệp json, chỉ là tệp js. Bạn cũng không cần phải gọi nhiệm vụ đồng hồ với grunt.task.run(). Dưới đây là ví dụ sử dụng đồng hồ để chia sẻ ngữ cảnh: https://github.com/gruntjs/grunt-contrib-watch/blob/nospawn/test/fixtures/nospawn/Gruntfile.js#L35 –

+1

Để giết quá trình con, hãy thực hiện: 'child.kill ('SIGINT'); ' –

5

Hãy xem grunt-nodemon mà xử lý rất nhiều những cơn đau đầu liên quan đến sinh sản một tiến trình con.

Các vấn đề liên quan