将glob压扁到一个目录

在Gulp中,我使用gulp.src从目录中select每个字体文件:

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

不过,我想将所有这些字体文件并列在一个目录中,而不是从components目录中重新创build整个树。

纵观Gulp,Gulp Utils和npm-glob API并不能真正帮助我,尽pipe我可以轻易地跳过它。

最好的办法是什么呢?

我会用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

另一个select是简单地重写gulp.dest文件的path:

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

另一个select是使用glob库来解开你的path,然后将文件path传递给gulp.src。 当gulp src接收到非文件的文件path时,相关的目录不会被维护,只是将文件复制到你指定的dest目录的根目录。 如果您需要在设置src之前执行任何自定义过滤或附加操作,则首先取消您的path也是有用的。

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