将glob展平到一个目录

Mar*_*ark 28 node.js gulp

在Gulp中,我gulp.src用来从目录中选择每个字体文件:

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

但是,我希望将所有这些字体文件并排放在一个目录中,而不是从components目录中重新创建整个树.

看看Gulp,Gulp Utils和npm-glob API并没有真正帮助我,尽管我可以很容易地跳过它.

最好的方法是什么?

Man*_*utz 36

我会用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'));
});
Run Code Online (Sandbox Code Playgroud)

至于如何在内部完成,请检查:https://github.com/armed/gulp-flatten/blob/master/index.js


dav*_*tar 20

另一个选择是简单地重写里面的文件路径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';
        }));
});
Run Code Online (Sandbox Code Playgroud)

您还可以使用此技术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));
});
Run Code Online (Sandbox Code Playgroud)

  • 低估的答案 (8认同)
  • 这几乎对我有用,但我不得不添加分隔符:`file.path = path.join(file.base,path.basename(file.path));` (3认同)