节点(Gulp)process.stdout.write到文件

我正在尝试为我进行unit testing,并将testing覆盖率输出到.lcov文件。

这是我迄今为止:

 gulp.task('test', function () { var test = fs.createWriteStream('./test.lcov', {flags: 'a'}); return gulp.src('./assets/js/test/test.js', {read: false}) .pipe(mocha({reporter: 'mocha-lcov-reporter'})) .pipe(test); }); 

mocha-lcov-reporter代码可以在这里find: https : //github.com/StevenLooman/mocha-lcov-reporter/blob/master/lib/lcov.js

它通过process.stdout.write()输出结果

但是,当我pipe这个到一个WriteStream我有以下错误:

 TypeError: Invalid non-string/buffer chunk at validChunk (_stream_writable.js:152:14) at WriteStream.Writable.write (_stream_writable.js:181:12) at Stream.ondata (stream.js:51:26) at Stream.emit (events.js:95:17) at drain (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:36:16) at Stream.stream.queue.stream.push (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:45:5) at Stream.stream (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/index.js:27:8) at Stream.stream.write (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:26:11) at write (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp/node_modules/vinyl-fs/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:623:24) at flow (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp/node_modules/vinyl-fs/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:632:7) 

看起来吞咽摩卡并不是完全成为一个真正的直通渠道,事实上,它看起来只是将源头引入摩卡实例,让摩卡完成这件事。

第一件事就是在bash中做一个简单的redirect。

 $ gulp test | grep -Ev "^\[[0-9:]{0,8}\]" > ./test.lcov 

当然,假设所有与吞吐量相关的输出将以[00:00:00]开始(以00为当前系统时间)。 如果不是这种情况,您最终可能会在文件的顶部和底部输出gulp。

如果你正在寻找一个更普遍的答案(阅读:使用nodejs),你可以重写process.stdout.write 。 这可能是:(大多数情况下,但它可以工作,诀窍是你不能覆盖process.stdout作为另一个stream,因为它在内部写成一个getter,但是你可以重写stdout.write函数。事实上,我只是为了我正在开发的一个项目做了这个工作,所以我可以查看其他开发人员的gulp日志,以防他们在构build系统时遇到问题。

我select了一个不那么asynchronous的解决scheme,因为与nodejs中的其他所有东西不同, stdoutstderr都是阻塞stream,并不像您习惯的asynchronous代码。 使用这个技巧你的任务最终会看起来像这样:

 gulp.task('test', function () { // clear out old coverage file fs.writeFileSync('./test.lcov', ''); // if you still want to see output in the console // you need a copy of the original write function var ogWrite = process.stdout.write; process.stdout.write = function( chunk ){ fs.appendFile( './test.lcov', chunk ); // this will write the output to the console ogWrite.apply( this, arguments ); }; return gulp.src('./assets/js/test/test.js', {read: false}) .pipe(mocha({reporter: 'mocha-lcov-reporter'})); }); 

我需要把所有的东西都logging在一个文件中,然后结束这个工作,

 var fs = require('fs'); var proc = require('process'); var origstdout = process.stdout.write, origstderr = process.stderr.write, outfile = 'node_output.log', errfile = 'node_error.log'; if (fs.exists(outfile)) { fs.unlink(outfile); } if (fs.exists(errfile)) { fs.unlink(errfile); } process.stdout.write = function( chunk ){ fs.appendFile(outfile, chunk.replace(/\x1b\[[0-9;]*m/g, '')); origstdout.apply(this, arguments); }; process.stderr.write = function( chunk ){ fs.appendFile(errfile, chunk.replace(/\x1b\[[0-9;]*m/g, '')); origstderr.apply(this, arguments); };