我需要一个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);
});
});
});
不幸的是,我仍然需要在子进程被杀死和杀死主进程之间的超时,如果我删除超时,它会发生子进程仍然挂起。这个解决方案当然可以改进。
答案 0 :(得分: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');
});