2015-09-28 200 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