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

时间:2014-10-16 05:37:43

标签: javascript node.js unit-testing mocha gulp

我试图让gulp为我处理我的单元测试,并将我的测试覆盖率输出到.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代码: https://github.com/StevenLooman/mocha-lcov-reporter/blob/master/lib/lcov.js

通过process.stdout.write()

输出结果

但是当我把它传递给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)

2 个答案:

答案 0 :(得分:3)

看起来gulp-mocha并没有完全设置为真正的直通流,事实上它看起来只是将源代码传输到Mocha实例中并让Mocha做它的事情。

我首先想要在bash中进行简单的重定向......

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

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

如果您正在寻找更通用的答案(阅读:使用nodejs),您可以重写process.stdout.write。这可能是:(大多数情况下它会起作用。诀窍是你不能将process.stdout覆盖为另一个流,因为它在内部被写为getter。但是你可以重写{{1}事实上,我刚刚为我正在进行的项目做了这个,所以我可以查看其他开发人员的gulp日志,以防他们遇到构建系统的问题。

我选择使用不那么异步的解决方案,因为与nodejs中的大多数其他内容不同,stdout.writestdout都是阻塞流,并且不像你的异步代码那样行事。 ;习惯了。使用这种技术,您的任务最终会看起来像这样:

stderr

答案 1 :(得分:0)

我需要将我的gulp进程中的所有内容记录到一个文件中,并最终得到这个对我来说没问题:

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);
};