Сгладить glob до одного каталога

Внутри Gulp я использую gulp.src для выбора каждого файла шрифта из каталога:

gulp.task('copy-fonts', function() {
   gulp.src('components/**/*.{ttf,woff,eof,svg}')
   .pipe(gulp.dest('build/fonts'));
});

Однако, я хотел бы, чтобы все эти файлы шрифтов зависали в одном каталоге бок о бок, а не восстанавливали все дерево из каталога components.

Поиск в Gulp, Gulp Utils и API-интерфейсах npm-glob действительно не помог мне, хотя я мог бы легко пропустить его.

Каким был бы лучший способ сделать это?

Ответ 1

Я бы использовал gulp -flatten:

var flatten = require('gulp-flatten');
gulp.task('copy-fonts', function() {
  gulp.src('dependencies/**/*.{ttf,woff,eof,svg}')
  .pipe(flatten())
 .pipe(gulp.dest('build/fonts'));
});

Как это делается внутри, проверьте: https://github.com/armed/gulp-flatten/blob/master/index.js

Ответ 2

Другой вариант - просто переписать путь к файлу внутри gulp.dest:

var path = require('path');
gulp.task('copy-fonts', function() {
    return gulp.src('components/**/*.{ttf,woff,eof,svg}')
        .pipe(gulp.dest(function(file) {
            file.path = file.base + path.basename(file.path);
            return 'build/fonts';
        }));
});

Вы также можете использовать эту технику с помощью gulp-changed:

var path = require('path');
var changed = require('gulp-changed');

gulp.task('copy-fonts', function() {
  var dest = 'build/fonts';
  return gulp.src('components/**/*.{ttf,woff,eof,svg}')
    .pipe(changed(function(file) {
      file.path = file.base + path.basename(file.path);
      return dest;
    }))
    .pipe(gulp.dest(dest));
});

Ответ 3

Другой вариант - использовать библиотеку glob для разглаживания ваших путей, а затем передать пути файлов в gulp.src. Когда gulp src получает непривязанные пути к файлам, относительный каталог не поддерживается и просто копирует файл в корень указанного вами имени dir. Также может быть полезно сначала перенести ваши пути, если вам нужно выполнить какую-либо настраиваемую фильтрацию или добавление до установки src.

glob = require('glob');
gulp.task('copy-fonts', function() {
  files = glob.sync('dependencies/**/*.{ttf,woff,eof,svg}');

  gulp.src(files)
  .pipe(gulp.dest('build/fonts'));
});