2014-01-16 21 views
23

在咕嘟咕嘟,我使用gulp.src选择从目录中的所有字体文件:拼合glob的下一个目录

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

不过,我想有这些字体文件在一个目录下侧风而不是从components目录重新创建整个树。

寻找在咕嘟咕嘟,咕嘟咕嘟utils的,和NPM-水珠的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

哇!我想我没有足够努力。 NPM中的例子几乎就是我的用例。 – Mark

+1

我建议通过这里的大多数条目来获得插件的可能性的一个好主意:http://gratimax.github.io/search-gulp-plugins/ - 这也是一个很好的方法来学习如何推出自己的阅读源代码! –

+0

@MangledDeutz链接被破坏 – radbyx

3

另一种选择是使用水珠库unglob你的路,然后通过文件路径放入gulp.src。当gulp src接收到非文件路径的文件路径时,相对目录不会被维护,只是将文件复制到您指定的dest目录的根目录。如果您需要在设置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));' –