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ư:
- 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
. child
không cókill
chức năng ...
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? –
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 –
Để giết quá trình con, hãy thực hiện: 'child.kill ('SIGINT'); ' –