首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到文件的节点(Gulp) process.stdout.write

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

Stack Overflow用户
提问于 2014-10-16 13:37:43
回答 2查看 2.3K关注 0票数 5

我正在尝试让gulp替我处理单元测试,并将我的测试覆盖率输出到一个.lcov文件。

这就是我到目前为止所知道的:

代码语言:javascript
复制
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时,我得到了以下错误:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2015-01-24 12:05:34

看起来gulp Mocha并没有完全设置成一个真正的直通流,实际上它看起来只是把源代码放到一个Mocha实例中,让Mocha做它自己的事情。

我想到的第一件事就是在bash中做一个简单的重定向...

代码语言:javascript
复制
$ gulp test | grep -Ev "^\[[0-9:]{0,8}\]" > ./test.lcov

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

如果你正在寻找一个更通用的答案(阅读:使用nodejs),你可以重写process.stdout.write。这可能是:(被大多数人接受,但它会起作用。诀窍在于您不能将process.stdout重写为另一个流,因为它在内部是作为getter编写的。但是,您可以重写stdout.write函数。事实上,我只是为我正在工作的一个项目这么做,这样我就可以查看其他开发人员的吞噬日志,以防他们在构建系统上遇到问题。

我选择了一个不太异步的解决方案,因为与nodejs中的大多数其他东西不同,stdoutstderr都是阻塞流,并且不像您所习惯的异步代码。使用此技术,您的任务最终将如下所示:

代码语言:javascript
复制
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'}));
});
票数 3
EN

Stack Overflow用户

发布于 2015-07-09 12:33:18

我需要将我吞咽过程中的所有东西记录到一个文件中,并最终得到这样的结果,这对我来说很好:

代码语言:javascript
复制
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);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26396947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档