将console.log输出到gulp事件的标准输出(stdout)

99

当运行或已经运行一个gulp任务时,我希望将日志记录到标准输出(配置环境)。

类似于这样:

gulp.task('scripts', function () {
  var enviroment = argv.env || 'development';
  var config = gulp.src('config/' + enviroment + '.json')
      .pipe(ngConstant({name: 'app.config'}));
  var scripts = gulp.src('js/*');

  return es.merge(config, scripts)
    .pipe(concat('app.js'))
    .pipe(gulp.dest('app/dist'))
    .on('success', function() { 
      console.log('Configured environment: ' + environment);
    });
});

我不确定应该回复哪个事件或者在哪里找到这些事件的列表。有什么建议吗?非常感谢。

3个回答

189

(2017年12月,提供日志记录的gulp-util模块已被弃用。Gulp团队建议开发人员使用fancy-log模块替代该功能。本答案已更新以反映此更改。)

fancy-log提供日志记录功能,最初由Gulp团队构建。

var log = require('fancy-log');
log('Hello world!');

为了添加日志记录,Gulp的API文档告诉我们.src返回:

返回可被传输到插件的Vinyl文件流。

Node.js的Stream文档提供了一个事件列表。下面是一个例子:

gulp.task('default', function() {
    return gulp.src('main.scss')
        .pipe(sass({ style: 'expanded' }))
        .on('end', function(){ log('Almost there...'); })
        .pipe(minifycss())
        .pipe(gulp.dest('.'))
        .on('end', function(){ log('Done!'); });
});
注意:`end`事件可能在插件完成之前被调用(并发送了其所有输出),因为该事件是在“所有数据已经刷新到底层系统”时调用的。

注意:`end`事件可能在插件完成之前被调用(并发送了其所有输出),因为该事件是在“所有数据已经刷新到底层系统”时调用的。


3
.on('end', () => gutil.log('ES6箭头函数语法,以实现简洁...')) - Frank N
19
为什么需要一个工具?为什么不能使用 console.log 呢? - Alex McMillan
5
对我来说 @AlexMcMillan .on('end', function(){ console.log('Almost there...'); }) 是有效的。 - Davey
3
它只是将输出以与日志的其余部分相同的样式漂亮地打印出来,以便您可以获得定时器。 - msanford
3
截至今天(2017年12月),gulp-util已被弃用:https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5 - m90

18

(请注意-在2017年12月,gulp-util模块已被弃用。)

为了进一步完善Jacob Budin的答案,我最近尝试过这个方法并发现它很有用。

var gulp = require("gulp");
var util = require("gulp-util");
var changed = require("gulp-changed");

gulp.task("copyIfChanged", function() {
    var nSrc=0, nDes=0, dest="build/js";
    gulp.src("app/**/*.js")
    .on("data", function() { nSrc+=1;})
    .pipe(changed(dest)) //filter out src files not newer than dest
    .pipe(gulp.dest(dest))
    .on("data", function() { nDes+=1;})
    .on("finish", function() {
        util.log("Results for app/**/*.js");
        util.log("# src files: ", nSrc);
        util.log("# dest files:", nDes);
    });
}

更新(2021年4月): 关于弃用的模块问题。 尝试用require('fancy-log')中的log替换require('gulp-util')中的util.log。其余的方法应该仍然有效。免责声明:我没有测试过。


.on("end").on("finish") 有什么不同? - Frank N
3
据我所理解,writable.on('finish') 可能在 readable.on('end') 之后触发。在这种情况下,确切的事件可能并不重要——我更关注记录有用的统计数据。 - Trevedhek
根据当前(7.5.0)文档: “'finish'”和“'end'”事件分别来自stream.Writable和stream.Readable类。 - msanford
1
gulp-util已被弃用,请使用fancy-log代替。 - slajma

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接