2016-08-09 243 views
2

Ich habe eine sehr grundlegende Verwendung von Schluck-foreach, die so schlecht versagt Ich stelle mir vor, ich muss etwas falsch machen; Ich versuche nur (vorläufig) alle Dateien in gulp.src zu drucken. Wenn Sie dies mit gulp-foreach tun, wird nur eine sehr, sehr kleine Probe der Dateien gedruckt - etwa 15 von vielen hundert. Wenn Sie Schluck-Druck verwenden, funktionieren die Dinge wie erwartet.Schluck-foreach nicht über alle Dateien schleifen

const gulp = require('gulp'), 
     foreach = require('gulp-foreach'), 
     gulpPrint = require('gulp-print'); 

gulp.src([`../../**/*.js`].concat([])) 
    .pipe(gulpPrint(path => { 
     console.log(path); 
    })) 
    .pipe(foreach((stream, file) => { 
     console.log(file.path); 
     return stream; 
    })) 

Der Code mit den foreach ist etwa 15-mal, verschachtelt mit den allein durch eine Flut von gulpPrint Anweisungen gefolgt gulpPrint, ausgelöst. Wenn ich den gulpPrint Teil kommentiert, foreach ungefähr 15mal druckt und dann beendet, und gulpPrint alleine, wie erwartet, überflutet die Konsole mit jeder gefundenen Datei, wie es sollte.

Ich kann einfach gulp-print verwenden, aber ich würde gerne wissen, was ich falsch mache mit gulp-foreach.

Antwort

2

Zunächst einmal: gulp-foreach ist nicht wirklich das richtige Plugin für Ihren Anwendungsfall.

gulp-foreach können Sie einen Teilstrom für jede Datei erstellen und die Ergebnisse des Teilstroms in den ursprünglichen Stream ausgeben. Das bedeutet, dass Sie für jede Eingabedatei mehrere Dateien ausgeben können (see this example). In dieser Hinsicht ist es der higher-order function flatmap in der funktionalen Programmierung sehr ähnlich. Deshalb hat der Autor von gulp-foreachrecently renamed das Plugin zu .

Alles, was Sie interessiert, ist, auf jede Datei im Stream zuzugreifen und seinen Pfad zu drucken, was dies zu einem Fall von higher-order function map macht. Die richtigen Plugins hierfür sind map-stream oder gulp-tap (das ist der Autor von gulp-foreachused to recommend).

Nun zu Ihrer eigentlichen Frage.

Wie bereits erwähnt, gibt gulp-foreach alle Dateien aus dem erstellten Teilstrom an den ursprünglichen Datenstrom aus. Sie tun nichts mit den Dateien, die in den ursprünglichen Stream geschrieben werden. Node.js Objektströme haben standardmäßig eine highWaterMark von 16, sobald also gulp-foreach 16 Dateien in den ursprünglichen Stream geschrieben hat ist der Puffer voll und gulp-foreach blockiert.

Um dies zu beheben, müssen Sie die Dateien konsumieren, die gulp-foreach in den Stream schreibt. Sie könnten einfach einen Dummy-.on('data') Handler für diese verwenden:

gulp.src([`../../**/*.js`].concat([])) 
    .pipe(gulpPrint(path => { 
    console.log(path); 
    })) 
    .pipe(foreach((stream, file) => { 
    console.log(file.path); 
    return stream; 
    })) 
    .on('data', (data) => { }); 

jedoch der üblicher Weg, dies in großem Schluck zu tun ist, schluck den Strom statt durch einfaches Zurückführen des Stroms von der Aufgabe verbrauchen zu lassen, in der sie erstellt wird:

gulp.task('default', function() { 
    return gulp.src([`../../**/*.js`].concat([])) 
    .pipe(gulpPrint(path => { 
     console.log(path); 
    })) 
    .pipe(foreach((stream, file) => { 
     console.log(file.path); 
     return stream; 
    })); 
}); 
+0

Große Antwort - danke. Gibt es irgendeinen Grund, dass "gulpPrint" nicht so gut ist wie "gulp-tap"? –

+1

Für Ihren Anwendungsfall: nein, nicht wirklich.'gulp-tap' ist allgemeiner, da es dir die gesamte [' Vinyl'-Datei] (https://github.com/gulpjs/vinyl) gibt, mit der du auf Dateiinhalte usw. zugreifen und sie bearbeiten kannst. Aber wenn du alles willst zu tun ist, Dateipfade zu drucken, 'gulp-print' wird gut funktionieren. –

0

der Grund, warum Ihr alle Dateien nicht zu sehen sind, ist, weil Sie ein Versprechen nicht zurückkommen, und die Aufgabe vor Iterieren über alle Dateien

Rückkehr der gulp.src wie dies Veredelung:

const gulp = require('gulp'), 
    foreac**strong text**h = require('gulp-foreach'), 
    gulpPrint = require('gulp-print'); 

gulp.task('default', function() { 
return gulp.src([`../../**/*.js`].concat([])) 
    .pipe(gulpPrint(path => { 
     console.log(path); 
    })) 
    .pipe(foreach((stream, file) => { 
     console.log(file.path); 
     return stream; 
    })) 

})