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

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

Чтобы создать задачу gulp не сложно:

var gulp = require('gulp');

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

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

Ответ 1

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

  • Если вы просто хотите увидеть имена, вы можете использовать что-то вроде 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, которое позволяет вам предоставить свою собственную функцию и посмотреть файлы в трубе.

Ответ 2

Я нашел, что этот плагин выполняет то, что я ожидал: 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

Ответ 3

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

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

Ответ 4

Вы можете использовать модуль 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 

Ответ 5

Для моего случая 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/'));
});

Ответ 6

Если вы хотите использовать ответ @OverZealous (fooobar.com/questions/52521/...) в Typescript, вам нужно import вместо require:

import * as debug from 'gulp-debug';

...

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

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

Ответ 7

Если вы хотите использовать имя файла для fork внутри канала, gulp-if может быть хорошим выбором.

gulp
  .task('foo', () => [...])
  .pipe(gulpif(file => {
    return file.path.indexOf('myName')? false : true;
  }, doSomething(), doSomethingElse()))
  .pipe(concat('output.file'));

My usecase - это угасающий JavaScript-разработчик, некоторые из которых содержат синтаксис ES6, с которым UglifyJS не справляется (и это уже было уменьшено).

Кстати: Gulp действительно не нужен плагин, чтобы дать вам доступ к чему-то базовому, как имя обработанного файла.