2016-09-19 6 views
0

Я пытаюсь написать задачу gulp для выполнения программы и дождаться нажатия любой клавиши для выхода из программы.Как правильно завершить задачу gulp

До сих пор у меня есть это:

gulp.task('runDevelopment', function (done) { 
    console.log('\n\n---\nPress any key to exit\n---\n'); 

    var api = spawn('node', ['node_modules/api-gateway-server/server.js', 'etc/swagger.yaml']); 
    api.stdout.on('data', function (data) { 
    console.log(data.toString()); 
    }); 
    api.stderr.on('data', function (data) { 
    console.log(data.toString()); 
    }); 

    process.stdin.on('data', function() { 
    api.kill('SIGKILL'); 
    done(); 
    }); 
}); 

Это запускает программу, и убивает его, как и ожидалось, но глоток никогда не выйдет. Я вижу это в консоли:

20:04 $ gulp 
[20:06:54] Using gulpfile ~/Development/swiki/gulpfile.js 
[20:06:54] Starting 'documentCopy'... 
[20:06:54] Starting 'documentZip'... 
[20:06:54] Starting 'runDevelopment'... 


--- 
Press any key to exit 
--- 

[20:06:54] Finished 'documentCopy' after 52 ms 
[20:06:54] Finished 'documentZip' after 41 ms 
[20:06:54] Starting 'package'... 
[20:06:54] Finished 'package' after 4.9 μs 
API Gateway server listening on port 7111 

[20:06:57] Finished 'runDevelopment' after 3.06 s 
[20:06:57] Starting 'run'... 
[20:06:57] Finished 'run' after 2.72 μs 
[20:06:57] Starting 'default'... 
[20:06:57] Finished 'default' after 1.16 μs 
Terminated: 15 
✘-TERM ~/Development/swiki [master|…6] 
20:07 $ 

глоток дает мне Terminated: 15 только после того как я killall gulp в другом терминале.

Как я могу заставить это работать правильно?

ответ

2

Проблема заключается в том, что вы успешно завершаете дочерний процесс, отправив SIGKILL, но вы все еще слушаете поступающие данные по process.stdin родительского процесса. Пока вы делаете это, родительский процесс не выйдет.

Вы должны явно указать process.stdin больше не испускают 'data' события по телефону stream.pause():

process.stdin.on('data', function() { 
    process.stdin.pause(); 
    api.kill('SIGKILL'); 
    done(); 
}); 

Если все остальное терпит неудачу вы также можете позвонить process.exit() в качестве последнего средства:

process.stdin.on('data', function() { 
    api.kill('SIGKILL'); 
    done(); 
    process.exit(0); 
}); 
Смежные вопросы