从吞噬问题运行业力任务

我正试图从gulp任务运行业力testing,我得到这个错误:

Error: 1 at formatError (C:\Users\Tim\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:161:10) at Gulp.<anonymous> (C:\Users\Tim\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:187:15) at Gulp.emit (events.js:95:17) at Gulp.Orchestrator._emitTaskDone (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\index.js:264:8) at C:\path\to\project\node_modules\gulp\node_modules\orchestrator\index.js:275:23 at finish (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8) at cb (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3) at removeAllListeners (C:\path\to\project\node_modules\karma\lib\server.js:216:7) at Server.<anonymous> (C:\path\to\project\node_modules\karma\lib\server.js:227:9) at Server.g (events.js:180:16) 

我的系统是Windows 7 ,nodejs版本是v0.10.32v0.10.32版本:

 [10:26:52] CLI version 3.8.8 [10:26:52] Local version 3.8.9 

此外,同样的错误我得到的Ubuntu 12.04 LTS而在较新的Ubuntu(不知道什么版本)和Mac OS似乎是工作正常。 什么会导致这个错误?

更新5/11/2016 :在写关于接受的答案隐藏错误的事实的评论之前,请先看两个评论,以接受答案。 只有在知道自己在做什么的情况下才使用它。 相关信息: https : //github.com/karma-runner/gulp-karma/pull/15

你如何用Gulp进行testing? 我最近在OSX上v0.11.14这个问题,运行节点v0.11.14v0.11.14 3.8.10 ,每当testing失败的时候。

改变build议:

 gulp.task('test', function(done) { karma.start({ configFile: __dirname + '/karma.conf.js', singleRun: true }, done); }); 

至:

 gulp.task('test', function(done) { karma.start({ configFile: __dirname + '/karma.conf.js', singleRun: true }, function() { done(); }); }); 

摆脱了这个错误

似乎是在callback中发生错误时,吞噬如何处理错误消息。 有关更多信息,请参阅退出时改进错误消息 。

这些解决scheme都没有正确使用gulp 3.9.1和karma 1.1.1。 添加对gulp-util的引用npm install --save-dev gulp-util并将任务更新到下面,以便很好地修复错误输出,同时正确保持退出状态。

 var gutil = require('gulp-util'); gulp.task('test', function (done) { new Server({ configFile: __dirname + '/karma.conf.js', singleRun: true }, function(err){ if(err === 0){ done(); } else { done(new gutil.PluginError('karma', { message: 'Karma Tests failed' })); } }).start(); }); 

下面是使用Karma的一些吞噬模式的代码片段。 这有点类似,但也使用新的方法如何启动业力。

 /** * Start the tests using karma. * @param {boolean} singleRun - True means run once and end (CI), or keep running (dev) * @param {Function} done - Callback to fire when karma is done * @return {undefined} */ function startTests(singleRun, done) { var child; var excludeFiles = []; var fork = require('child_process').fork; var KarmaServer = require('karma').Server; var serverSpecs = config.serverIntegrationSpecs; if (args.startServers) { log('Starting servers'); var savedEnv = process.env; savedEnv.NODE_ENV = 'dev'; savedEnv.PORT = 8888; child = fork(config.nodeServer); } else { if (serverSpecs && serverSpecs.length) { excludeFiles = serverSpecs; } } var server = new KarmaServer({ configFile: __dirname + '/karma.conf.js', exclude: excludeFiles, singleRun: singleRun }, karmaCompleted); server.start(); //////////////// function karmaCompleted(karmaResult) { log('Karma completed'); if (child) { log('shutting down the child process'); child.kill(); } if (karmaResult === 1) { done('karma: tests failed with code ' + karmaResult); } else { done(); } } } 

什么为我工作,并提供了一个不错的格式化错误信息是提供一个错误实例donecallback。

 gulp.task('test', function(done) { karma.start({ configFile: __dirname + '/karma.conf.js', singleRun: true }, function(result) { if (result > 0) { return done(new Error(`Karma exited with status code ${result}`)); } done(); }); }); 

如果你想返回一个错误代码,并希望看到Karma的错误输出,但不是Gulp的(可能不相关的)堆栈跟踪:

 gulp.task('test', function() { karma.start({ configFile: __dirname + '/karma.conf.js', singleRun: true }, function(karmaExitStatus) { if (karmaExitStatus) { process.exit(1); } }); }); 

不知道Ubuntu的,但我得到了类似的错误在Windows上,安装一个版本回来修复它马上就像这样:

 npm install -g gulp@3.8.8 npm install gulp@3.8.8 

这是咕嘟咕嘟的告诉你的testing失败了,业力退出,返回代码1.你为什么要自己打电话做,而不是通过错误作为消息困扰我。

根据Karma的文档和https://github.com/pkozlowski-opensource解决这个问题的正确方法是依靠Karma的手表机制而不是Gulp的:;

 gulp.task('tdd', function (done) { karma.start({ configFile: __dirname + '/karma.conf.js' }, done); }); 

注意singleRun: true的省略singleRun: true

@ McDamon的解决方法将适用于gulp.watch ,但是您不希望在CI服务器上运行时吞下那样的退出代码。

Gulp也在重新devise他们如何处理像这样的场景中的退出代码。 见https://github.com/gulpjs/gulp/issues/71和其他十几个相关的问题。;

 gulp.task('test', function(done) { karma.start({ configFile: __dirname + '/karma.conf.js', singleRun: false }, done); }); 

传递singleRun: false参数会阻止进程返回一个不同于0的值(这意味着错误并退出)。

使用singleRun: true运行singleRun: true如果仅从命令行启动testing,则不是运行连续集成套件的一部分。

如果有其他人来到这里,不要使用公认的解决scheme。 它会隐藏失败的testing。 如果你需要一个快速的解决scheme来修改你的gulptesting任务,你可以在这个 github线程中使用这个注释中的解决scheme。

 gulp.src(src) // pipeline... .on('error', function (error) { console.error('' + error); });