只是写了一个(到目前为止)非常简单的 gulpfile,我对遇到的错误感到困惑。
当这个任务的测试失败时,gulp 优雅地退出
gulp.task('test', done => {
new KarmaServer({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, () => done()).start();
});
...产生:
Chrome 50.0.2661 (Mac OS X 10.11.3): Executed 11 of 11 (3 FAILED) (0.053 secs / 0.023 secs)
[17:38:02] Finished 'test' after 2.43 s
但是当你精简它只是将 done
传递给 Karma 时,它会相当不优雅地失败
gulp.task('test', done => {
new KarmaServer({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, done).start();
});
...产生:
Chrome 50.0.2661 (Mac OS X 10.11.3): Executed 11 of 11 (3 FAILED) (0.066 secs / 0.042 secs)
[17:36:39] 'test' errored after 2.45 s
[17:36:39] Error: 1
at formatError (/usr/local/lib/node_modules/gulp/bin/gulp.js:169:10)
at Gulp.<anonymous> (/usr/local/lib/node_modules/gulp/bin/gulp.js:195:15)
at emitOne (events.js:77:13)
at Gulp.emit (events.js:169:7)
at Gulp.Orchestrator._emitTaskDone (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/index.js:264:8)
at /Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/index.js:275:23
at finish (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8)
at cb (/Users/markstickley/workspace/timewarp/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:29:3)
at removeAllListeners (/Users/markstickley/workspace/timewarp/node_modules/karma/lib/server.js:336:7)
at Server.<anonymous> (/Users/markstickley/workspace/timewarp/node_modules/karma/lib/server.js:347:9)
at Server.g (events.js:260:16)
at emitNone (events.js:72:20)
at Server.emit (events.js:166:7)
at emitCloseNT (net.js:1518:8)
at doNTCallback1 (node.js:418:9)
at process._tickCallback (node.js:340:17)
鉴于 done
是一个函数并且 done
的所有包装版本所做的都是调用 done
,谁能解释为什么会发生这种情况?
最佳答案
进一步的研究表明,Karma 使用退出代码 (https://karma-runner.github.io/0.13/dev/public-api.html) 解析传递给它的回调:
var Server = require('karma').Server
var server = new Server({port: 9876}, function(exitCode) {
console.log('Karma has exited with ' + exitCode)
process.exit(exitCode)
})
如果 done
被传递给 null
或 undefined
( https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname--deps-fn ) 以外的任何参数,gulp 将退出运行:
gulp.task('one', function(cb) {
// do stuff -- async or otherwise
cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
});
因此,当 done
作为回调直接传递给 Karma 时,Karma 的退出代码导致 gulp 过早退出。将它包装在一个函数中意味着 done
仍然被调用但没有任何参数——导致正常完成。
关于javascript - 为什么将 `done` 函数传递给 Karma 的服务器时会出现 gulp 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551521/