2014-01-16 5 views
23

Innerhalb Gulp, ich gulp.src bin mit jeder Font-Datei aus einem Verzeichnis auszuwählen:Flatten glob bis auf ein Verzeichnis

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

Allerdings würde Ich mag all diese Schriftart-Dateien haben, in einem Verzeichnis Seite aufzuzuwickeln -By-Side-statt die gesamte Struktur aus dem components Verzeichnis neu erstellt.

In den Schluck zu schauen, half mir Gulp Utils und npm-glob APIs nicht wirklich, obwohl ich leicht davon hätte überspringen können.

Was wäre der beste Weg, um dies zu tun?

Antwort

30

ich schluck-abflachen verwenden würde:

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

, wie diese intern durchgeführt wird, überprüfen Sie: https://github.com/armed/gulp-flatten/blob/master/index.js

+0

Wow! Ich glaube, ich habe nicht genug gesucht. Das Beispiel im NPM ist ziemlich genau mein Anwendungsfall. – Mark

+1

Ich würde vorschlagen, die meisten Einträge hier durchzulesen, um eine gute Vorstellung davon zu bekommen, was mit Plugins möglich ist: http://gratimax.github.io/search-gulp-plugins/ - es ist auch ein guter Weg, um zu lernen, wie man seine eigenen Rollen erstellt Quelle dort lesen! –

+0

@MangledDeutz der Link ist gebrochen – radbyx

3

Eine weitere Option ist die glob-Bibliothek zu benutzen, um Ihre Pfade zu unglob, und dann den Pass Dateipfade in gulp.src. Wenn gulp src unglobbierte Dateipfade empfängt, wird das relative Verzeichnis nicht beibehalten und kopiert die Datei einfach in das Stammverzeichnis des Zielverzeichnisses, das Sie angeben. Es kann auch nützlich sein, die Pfade zuerst zu entfernen, wenn Sie vor dem Festlegen von src eine benutzerdefinierte Filterung oder Anhängen durchführen müssen.

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

Eine weitere Option ist es, den Dateipfad innerhalb gulp.dest einfach zu umschreiben:

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

Sie auch diese Technik mit gulp-changed verwenden können:

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

Unterschätzte Antwort – mate64

+1

Dies funktionierte fast für mich, aber ich musste Trennzeichen hinzufügen: 'file.path = path.join (file.base, path.basename (Datei.Pfad)); ' –