2015-09-28 199 views
3

我需要启动服务器的gulp任务,运行mocha测试并最终关闭它。我有以下代码:运行摩卡测试后,如何杀死nodemon进程?

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测试相同的过程中启用和关闭应用程序也不是一种选择。


UPDATE:

除了ThomasBromans答案,我想出了这个解决方案,它似乎在我的情况下工作。每当gulp-mocha完成测试,它会发出'结束'事件。发生这种情况时,我们只需要发射的子进程“退出”,然后杀死的主要过程,就像这样:

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); 
     });    
    });  
}); 

不幸的是我还需要子进程之间被杀害和主要过程杀害超时,如果我删除超时它发生子进程仍然挂起。这个解决方案当然可以改进。

回答

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'); 
}); 
+0

感谢您的回答。这只是彻底杀死了我的过程。当管道命令到达process.exit()时,似乎摩卡甚至没有时间正确启动。它也杀死了吞噬任务进程,但由nodemon创建的进程仍然活跃,并在任务管理器中看到。 我目前正在看“nodemon.emit('quit');”从他们的官方api中得到的命令类型将会看到我是否能够在摩卡运行结束时发出命令。 – Vee6

+0

@ Vee6嗯。奇怪的。我没有用摩卡尝试过,但它可以与其他一些吞咽任务无缝地结合在一起。你可以尝试运行一个序列。如果你愿意,我可以更新我的答案? –

+0

按顺序你的意思是像async.series或类似的东西?如果你可以更新这个案例,我将不胜感激。 – Vee6