console.log a stdout en eventos gulp

87

Quiero iniciar sesión en stdout (el entorno de configuración) cuando una tarea de gulp se está ejecutando o se ha ejecutado.

Algo como esto:

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

No estoy seguro de a qué evento debería responder ni dónde encontrar una lista de estos. ¿Algún consejo? Muchas gracias.

Rimiano
fuente

Respuestas:

170

(En diciembre de 2017, el gulp-utilmódulo, que proporcionaba registro, quedó obsoleto . El equipo de Gulp recomendó que los desarrolladores reemplazaran esta funcionalidad con el fancy-logmódulo. Esta respuesta se actualizó para reflejar eso).

fancy-log proporciona registro y fue construido originalmente por el equipo de Gulp.

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

Para agregar el registro, la documentación de la API de Gulp nos dice que .srcdevuelve:

Devuelve un flujo de archivos de vinilo que se pueden canalizar a complementos.

La Streamdocumentación de Node.js proporciona una lista de eventos. Juntos, aquí hay un ejemplo:

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: El endevento se puede llamar antes de que el complemento esté completo (y haya enviado toda su propia salida), porque el evento se invoca cuando "todos los datos se han vaciado al sistema subyacente".

Jacob Budin
fuente
2
.on('end', () => gutil.log('ES6 arrow syntax for simplicity...') )
Frank Nocke
12
¿Alguna idea de por qué se necesita una herramienta? ¿Por qué no console.logfunciona?
Alex McMillan
4
@AlexMcMillan .on('end', function(){ console.log('Almost there...'); })funciona para mí.
Davey
3
@AlexMcMillan Simplemente imprime la salida con el mismo estilo que el resto del registro para obtener temporizadores.
msanford
3
A partir de hoy (diciembre de 2017), gulp-utilha quedado obsoleto: medium.com/gulpjs/gulp-util-ca3b1f9f9ac5
m90
15

(TENGA EN CUENTA: en diciembre de 2017, el gulp-utilmódulo quedó obsoleto).

Para aprovechar la respuesta de Jacob Budin , recientemente probé esto y lo encontré ú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
fuente
.on("end")y .on("finish")diferir en que?
Frank Nocke
3
Según tengo entendido, writable.on('finish')se disparará cuando readable.on('end')no. El evento exacto puede no importar en este caso; estaba más enfocado en registrar estadísticas útiles.
Trevedhek
Según la documentación actual (7.5.0): "Los eventos 'finish'y 'end'son de las clases stream.Writabley stream.Readable, respectivamente". @FrankNocke
msanford
gulp-utilha sido obsoleto, use fancy-logen su lugar
slajma