console.log para stdout em eventos gulp

87

Quero fazer logon no stdout (o ambiente de configuração) quando uma tarefa gulp está em execução ou foi executada.

Algo assim:

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

Não tenho certeza de qual evento devo responder ou onde encontrar uma lista deles. Quaisquer dicas? Muito Obrigado.

Rimian
fonte

Respostas:

170

(Em dezembro de 2017, o gulp-utilmódulo, que fornecia o registro, foi descontinuado . A equipe do Gulp recomendou que os desenvolvedores substituíssem essa funcionalidade pelo fancy-logmódulo. Esta resposta foi atualizada para refletir isso.)

fancy-log fornece registro e foi originalmente construído pela equipe Gulp.

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

Para adicionar o registro, a documentação da API de Gulp nos diz que .srcretorna:

Retorna um fluxo de arquivos de vinil que podem ser canalizados para plug-ins.

A Streamdocumentação do Node.js fornece uma lista de eventos. Juntos, aqui está um exemplo:

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

Nota: O endevento pode ser chamado antes que o plugin seja concluído (e tenha enviado toda a sua própria saída), porque o evento é chamado quando "todos os dados foram liberados para o sistema subjacente".

Jacob Budin
fonte
2
.on('end', () => gutil.log('ES6 arrow syntax for simplicity...') )
Frank Nocke
12
Alguma ideia de por que uma ferramenta é necessária? Por que não console.logfunciona?
Alex McMillan
4
@AlexMcMillan .on('end', function(){ console.log('Almost there...'); })funciona para mim.
Davey de
3
@AlexMcMillan Ele simplesmente imprime a saída no mesmo estilo do resto do log para que você obtenha cronômetros.
msanford
3
A partir de hoje (dezembro de 2017), gulp-utilfoi descontinuado: medium.com/gulpjs/gulp-util-ca3b1f9f9ac5
m90
15

(ATENÇÃO - Em dezembro de 2017, o gulp-utilmódulo foi descontinuado.)

Para desenvolver a resposta de Jacob Budin , recentemente tentei isso e achei útil.

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);
    });
}
Trevedhek
fonte
.on("end")e .on("finish")diferem por quê?
Frank Nocke
3
Pelo que entendi, writable.on('finish')vai disparar quando readable.on('end')não pode. O evento exato pode não importar neste caso - eu estava mais focado em registrar estatísticas úteis.
Trevedhek
De acordo com a documentação atual (7.5.0): "Os eventos 'finish'e 'end'são das classes stream.Writablee stream.Readable, respectivamente." @FrankNocke
msanford
gulp-utilfoi descontinuado, use em fancy-logvez disso
slajma