Получить текущее имя файла в gulp.src ()

141

В моем файле gulp.js я транслирую все файлы HTML из examplesпапки в buildпапку.

Создать задачу gulp несложно:

var gulp = require('gulp');

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

Но я не могу понять, как получить имена файлов, найденные (и обработанные) в задаче, или не могу найти нужный плагин.

dkastl
источник
Если вы решили свою проблему, вы должны либо опубликовать свой ответ ниже. Вы не должны просто редактировать свой вопрос с решением.
Эндрю Маршалл
2
@AndrewMarshall ... как объясняет мой комментарий к удаленной вами редакции, я не хочу утверждать, что нашел правильный ответ, но хочу отдать должное ответу, который этого заслуживает. Вот почему я не разместил небольшую модификацию в качестве ответа. Если вы думаете, что удаление моей правки лучше для пользователей (или просто соответствует правилам этого сайта), то я с этим согласен. Если кто-то другой, просто нажмите на историю редактирования, чтобы увидеть, что там было раньше.
dkastl

Ответы:

176

Я не уверен, как вы хотите использовать имена файлов, но одно из них должно помочь:

  • Если вы просто хотите увидеть имена, вы можете использовать что-то вроде gulp-debug, в котором перечислены детали винилового файла. Вставьте это в любое место, где хотите получить список, например:

    var gulp = require('gulp'),
        debug = require('gulp-debug');
    
    gulp.task('examples', function() {
        return gulp.src('./examples/*.html')
            .pipe(debug())
            .pipe(gulp.dest('./build'));
    });
    
  • Другой вариант gulp-filelog, который я не использовал, но звучит похоже (он может быть немного чище).

  • Другой вариант: gulp-filesizeвыводит как файл, так и его размер.

  • Если вам нужен больший контроль, вы можете использовать что-то вроде gulp-tap, что позволяет вам предоставить свою собственную функцию и просматривать файлы в конвейере.

Чрезмерно рьяный
источник
7
Спасибо! Плагины "журнала" не то, что я искал, потому что он записывает только в журнал консоли. Но gulp-tapпозволяет получить путь для каждого файла, поэтому я могу использовать его для обновления моего списка в другом файле HTML.
dkastl
Что, если я хочу хранить все файлы src в массиве? отладка не дает много вариантов.
Абхинав Синги
25

Я обнаружил, что этот плагин делает то, что я ожидал: gulp-using

Простой пример использования: поиск всех файлов в проекте с расширением .jsx

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

Выход:

[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
Викрам
источник
gulp-using сделал то, что я искал, большое спасибо.
sghosh968
11

Вот еще один простой способ.

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'));
});
Ник
источник
5
Вы знаете, большинство людей не знают coffeescript, поэтому было бы намного полезнее просто написать ответ самым простым способом, чтобы максимальное количество читателей было полезно :)
vsync
У меня es.mapвыдает ошибку:SyntaxError: Unexpected token .
vsync
2
+1 за это решение (без плагинов). Но есть ошибка, return cb(); она должна быть cb(null, file);. В противном случае файлы будут отфильтрованы и не пойдут дальше по конвейерной цепочке. Дополнительная информация проверьте документы для es.map ()
Dimitry K
5

Вы можете использовать модуль gulp-filenames, чтобы получить массив путей. Вы даже можете сгруппировать их по пространствам имен:

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 
Serge
источник
3

В моем случае gulp-ignore был идеальным вариантом. Как вариант, вы можете передать туда функцию:

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

И задача будет выглядеть так:

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

gulp.task('task', function() {
  gulp.src('./**/*.js')
    .pipe(gulpIgnore.exclude(condition))
    .pipe(gulp.dest('./dist/'));
});
Ленивый эксперт
источник
0

Если вы хотите использовать ответ @OverZealous ( https://stackoverflow.com/a/21806974/1019307 ) в Typescript, вам необходимо importвместо require:

import * as debug from 'gulp-debug';

...

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

(Я также добавил title).

HankCa
источник
почему importвместо require?
vsync
Да я не знаю. Это было в первые дни моей разработки JS, и, размышляя, мне следовало больше исследовать, почему это сработало для меня. Но это произошло, и поэтому я поставил это!
HankCa 05