Как я могу убить процесс nodemon после запуска тестов мокко?

Мне нужна задача gulp, которая запускает сервер, запускает mocha тесты для него и, наконец, закрывает его. У меня есть следующий код:

var mocha = require('gulp-mocha');
var nodemon = require('nodemon');

gulp.task('my-integration-tests', function () {    
  return nodemon({ script: './server.js' })
    .on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha());            
  });    
});

Сервер успешно запущен и тесты запущены. Однако после этого процесс, созданный nodemon, все еще жив. Есть ли способ закрыть nodemon после завершения? Кроме того, открытие и закрытие приложения в том же процессе, что и тесты mocha, не является вариантом с текущей конфигурацией.


ОБНОВИТЬ:

Помимо ответа ThomasBromans, я придумал это решение, которое, похоже, работает в моем случае. Всякий раз, когда gulp-mocha завершает тесты, он как бы выдает событие «конец». Когда это происходит, нам нужно только запустить 'quit' для дочернего процесса, а затем убить основной процесс, например:

gulp.task('my-integration-tests', function () {    
  var childProc = nodemon({ script: './server.js' });

  childProc.on('quit', function () {
    console.log('event emitted, child process is being killed');
  })

  childProc.on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha())
        .once('end', function () {
          console.log('mocha stuff ended. time to kill processes');
          childProc.emit('quit');
          setTimeout(function () {
            console.log('kill main process');
            process.exit();
          }, 1500);
        });            
  });    
});

К сожалению, мне все еще нужен тайм-аут между уничтожением дочернего процесса и убийством основного процесса, если я убираю тайм-аут, случается, что дочерний процесс остается зависшим. Это решение, конечно, открыто для улучшений.


person Vee6    schedule 28.09.2015    source источник


Ответы (1)


Вы можете выйти из процесса с помощью process.exit(). Просто добавьте еще один .pipe. Ваша задача будет выглядеть так:

gulp.task('my-integration-tests', function () {    
  return nodemon({ script: './server.js' })
    .on('start', function () {
      gulp.src(['./mySpecs.spec.js'])
        .pipe(mocha())
        .pipe(process.exit());
  });
});

ИЗМЕНИТЬ запуск задач в последовательности (я не уверен, что это работает без каких-либо изменений):

var gulp = require('gulp'),
    mocha = require('gulp-mocha'),
    nodemon = require('nodemon'),
    runSequence = require('run-sequence');

gulp.task('nodemon', function() {
    return nodemon({script: './server.js'});
});

gulp.task('mocha', function() {
    return mocha();
});

gulp.task('stop', function() {
    process.exit();
});

gulp.task('my-integration-tests', function () {    
    runSequence('nodemon',
                'mocha',
                'stop');
});
person Thomas Bormans    schedule 28.09.2015
comment
Спасибо за ответ. Это просто убивает мой процесс. Кажется, мокко даже не успевает запуститься должным образом, так как команда pipe поступает в process.exit(). Это также убивает процесс задачи gulp, но процесс, созданный nodemon, жив и хорошо виден в диспетчере задач. Сейчас я просматриваю nodemon.emit('quit'); тип команд, взятый из их официального API, увидит, смогу ли я заставить его излучать в конце запуска мокко. - person Vee6; 28.09.2015
comment
@ Vee6 Хм. Странный. Я не пробовал это с Mocha, но он работал без проблем с некоторыми другими задачами gulp. Вы можете попробовать запустить последовательность. Я могу обновить свой ответ, если хотите? - person Thomas Bormans; 28.09.2015
comment
под последовательностью вы имеете в виду что-то вроде async.series или что-то в этом роде? если бы вы могли обновить для этого случая, я был бы признателен. - person Vee6; 28.09.2015
comment
@ Vee6 Vee6 Я обновил свой ответ. Хотя не уверен на 100% в синтаксисе. Возможно, вам придется обновить некоторые незначительные вещи. - person Thomas Bormans; 28.09.2015
comment
Спасибо. Решение runSequence выглядит довольно элегантно. Тем временем я придумал свой собственный, который я также опубликую. - person Vee6; 28.09.2015