在Gulp中,我使用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并没有真正帮助我,尽管我可以很容易地跳过它。
最好的方法是什么?
答案 0 :(得分:34)
我会使用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
答案 1 :(得分:18)
另一种选择是简单地重写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));
});
答案 2 :(得分:3)
另一个选择是使用glob库来取消路径,然后将文件路径传递给gulp.src。当gulp src接收到未经过处理的文件路径时,不会维护相对目录,只是将文件复制到您指定的目标目录的根目录。如果在设置src之前需要进行任何自定义过滤或追加,首先对路径进行unglob也很有用。
glob = require('glob');
gulp.task('copy-fonts', function() {
files = glob.sync('dependencies/**/*.{ttf,woff,eof,svg}');
gulp.src(files)
.pipe(gulp.dest('build/fonts'));
});