Obtener el nombre del archivo actual en gulp.src ()

138

En mi archivo gulp.js, estoy transmitiendo todos los archivos HTML de la examplescarpeta a la buildcarpeta.

Crear la tarea de tragar no es difícil:

var gulp = require('gulp');

gulp.task('examples', function() {
    return gulp.src('./examples/*.html')
        .pipe(gulp.dest('./build'));
});

Pero no puedo entender cómo recuperar los nombres de archivo encontrados (y procesados) en la tarea, o no puedo encontrar el complemento correcto.

dkastl
fuente
Si ha resuelto su problema, debe publicar su respuesta a continuación. Usted debe no sólo tiene que editar su pregunta con la solución.
Andrew Marshall
2
@ AndrewMarshall ... como explica mi comentario a la edición, que eliminó, no quiero afirmar que he encontrado la respuesta correcta, pero quiero dar los créditos a la respuesta que lo merece. Es por eso que no publiqué la pequeña modificación como respuesta. Si crees que eliminar mi edición es mejor para los usuarios (o simplemente cumple con las reglas de este sitio), entonces estoy de acuerdo con eso. Para cualquier otra persona, simplemente haga clic en el historial de edición para ver lo que había antes.
dkastl

Respuestas:

174

No estoy seguro de cómo desea usar los nombres de archivo, pero uno de estos debería ayudar:

  • Si solo desea ver los nombres, puede usar algo como gulp-debug, que enumera los detalles del archivo de vinilo. Inserte esto en cualquier lugar donde desee una lista, así:

    var gulp = require('gulp'),
        debug = require('gulp-debug');
    
    gulp.task('examples', function() {
        return gulp.src('./examples/*.html')
            .pipe(debug())
            .pipe(gulp.dest('./build'));
    });
  • Otra opción es gulp-filelog, que no he usado, pero suena similar (podría ser un poco más limpio).

  • Otra opción es gulp-filesize, que genera tanto el archivo como su tamaño.

  • Si desea más control, puede usar algo como gulp-tap, que le permite proporcionar su propia función y mirar los archivos en la tubería.

Demasiado entusiasta
fuente
77
¡Gracias! Los complementos de "registro" no eran lo que estaba buscando, porque solo escribe en el registro de la consola. Pero gulp-tappermite obtener la ruta para cada archivo, por lo que puedo usarlo para actualizar mi lista en otro archivo HTML.
dkastl
¿Qué sucede si quiero almacenar todos los archivos src en una matriz? la depuración no ofrece muchas opciones.
Abhinav Singi
22

Encontré que este complemento está haciendo lo que esperaba: tragar usando

Ejemplo de uso simple: busque todos los archivos del proyecto con extensión .jsx

gulp.task('reactify', function(){
        gulp.src(['../**/*.jsx']) 
            .pipe(using({}));
        ....
    });

Salida:

[gulp] Using gulpfile /app/build/gulpfile.js
[gulp] Starting 'reactify'...
[gulp] Finished 'reactify' after 2.92 ms
[gulp] Using file /app/staging/web/content/view/logon.jsx
[gulp] Using file /app/staging/web/content/view/components/rauth.jsx
Vikram
fuente
usar trago hizo lo que estaba buscando muchas gracias.
sghosh968
10

Aquí hay otra manera simple.

var es, log, logFile;

es = require('event-stream');

log = require('gulp-util').log;

logFile = function(es) {
  return es.map(function(file, cb) {
    log(file.path);
    return cb();
  });
};

gulp.task("do", function() {
 return gulp.src('./examples/*.html')
   .pipe(logFile(es))
   .pipe(gulp.dest('./build'));
});
Mella
fuente
55
Ya sabes, la mayoría de la gente no conoce el coffeescript, por lo que sería mucho más beneficioso escribir la respuesta de la manera más básica para que el número máximo de lectores se beneficiaría :)
vsync
Para mí es.maparroja un error:SyntaxError: Unexpected token .
VSYNC
1
+1 para esta solución (sin complementos). Pero hay un error, en cambio return cb(); debería serlo cb(null, file);. De lo contrario, los archivos se filtrarán y no irán más abajo en la cadena de tuberías. Más información consultar documentos para es.map ()
Dimitry K
5

Puede usar el módulo gulp-filenames para obtener la matriz de rutas. Incluso puede agruparlos por espacios de nombres:

var filenames = require("gulp-filenames");

gulp.src("./src/*.coffee")
    .pipe(filenames("coffeescript"))
    .pipe(gulp.dest("./dist"));

gulp.src("./src/*.js")
  .pipe(filenames("javascript"))
  .pipe(gulp.dest("./dist"));

filenames.get("coffeescript") // ["a.coffee","b.coffee"]  
                              // Do Something With it 
Sarga
fuente
3

Para mi caso, gulp-ignore fue perfecto. Como opción, puede pasar una función allí:

function condition(file) {
 // do whatever with file.path
 // return boolean true if needed to exclude file 
}

Y la tarea se vería así:

var gulpIgnore = require('gulp-ignore');

gulp.task('task', function() {
  gulp.src('./**/*.js')
    .pipe(gulpIgnore.exclude(condition))
    .pipe(gulp.dest('./dist/'));
});
Lazyexpert
fuente
0

Si desea usar la respuesta de @OverZealous '( https://stackoverflow.com/a/21806974/1019307 ) en Typecript, necesita en importlugar de require:

import * as debug from 'gulp-debug';

...

    return gulp.src('./examples/*.html')
        .pipe(debug({title: 'example src:'}))
        .pipe(gulp.dest('./build'));

(También agregué a title).

HankCa
fuente
¿Por qué en importlugar de require?
vsync
Si no lo se Eso fue en mis primeros días de desarrollo de JS y, en reflexión, debería haber investigado más por qué eso funcionó para mí. ¡Pero lo hizo y por eso lo puse!
HankCa