2014-01-16 7 views
23

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

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

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

Глядя в Gulp, Gulp Utils и npm-glob API, мне действительно не помогли, хотя я мог легко пропустить это.

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

ответ

30

Я хотел бы использовать глотка-выравниваться:

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

+0

Wow! Наверное, я не искал достаточно сильно. Пример в NPM в значительной степени соответствует моему варианту использования. – Mark

+1

Я бы предложил пройти через большинство записей здесь, чтобы получить хорошее представление о том, что возможно с плагинами: http://gratimax.github.io/search-gulp-plugins/ - это также хороший способ научиться катиться самостоятельно источник чтения там! –

+0

@MangledDeutz ссылка не работает – radbyx

3

Другой вариант заключается в использовании библиотеки Глоб, чтобы unglob ваши пути, а затем передать путь к файлу gulp.src. Когда gulp src получает непривязанные пути к файлам, относительный каталог не поддерживается и просто копирует файл в корень указанного вами файла. Также может быть полезно сначала разгладить ваши пути, если вам нужно выполнить какую-либо пользовательскую фильтрацию или добавление до установки 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')); 
}); 
16

Другим вариантом является просто переписать путь к файлу внутри 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)); 
}); 
+5

Недооцененный ответ – mate64

+1

Это почти сработало для меня, но мне пришлось добавить разделитель: 'file.path = path.join (file.base, path.basename (file.path)); ' –

 Смежные вопросы

  • Нет связанных вопросов^_^