2014-09-01 2 views
13

SSCCE:Wie erstellt man einen leeren Stream in Gulp?

gulp.task('foo', [], function() { 
    var barFiles = getBarFiles(); 
    var bazFiles = getBazFiles(); 

    var barStream, bazStream; 
    if (barFiles && barFiles.length > 0) { 
     barStream = gulp.src(barFiles); 
    } 
    if (bazStream && bazStream.length > 0) { 
     bazStream = gulp.src(bazStream); 
    } 
    return eventStream 
     .merge(barStream, bazStream) 
     .pipe(g.concat('bar-and-baz')) 
     .pipe(gulp.dest('./foo-output/')); 
}); 

getBarFiles() oder getBazFiles() kann ein leeres Array zurück, die nicht durch gulp.src() erlaubt ist: Error: Invalid glob argument, daher die Notwendigkeit, die Erzeugung des Stroms mit einem if Zustand zu wickeln.

Also die Frage ist, wie erstelle ich einen leeren Stream, , so dass es mit dem anderen leer in nicht leeren Stream zusammengeführt werden kann?

+4

Sie könnten versuchen, mit ['gulp-util.noop'] (https://github.com/gulpjs/gulp-util#noop) einen leeren Stream zu erstellen. – Chris

+0

@Chris so, "ein Stream, der nichts anderes tut, als Daten direkt weiterzuleiten", braucht keine 'gulp.src' zu haben, um Daten durchzuleiten? – bguiz

+0

So verstehe ich es zu handeln. Allerdings habe ich keine Frist mit dieser Methode, so müssten Sie schauen, ob dies Ihre Frage beantwortet (weshalb ich dies als Kommentar gepostet, anstatt als Antwort). – Chris

Antwort

0

eine Lösung:

gulp.task('foo', [], function() { 
    var barFiles = getBarFiles(); 
    var bazFiles = getBazFiles(); 

    var barStream, bazStream; 
    if (barFiles && barFiles.length > 0) { 
     barStream = gulp.src(barFiles); 
    } 
    if (bazStream && bazStream.length > 0) { 
     bazStream = gulp.src(bazStream); 
    } 
    var mergedStream; 
    if (barStream && bazStream) { 
     mergedStream = eventStream 
      .merge(barStream, bazStream); 
    } 
    else if (barStream || bazStream) { 
     mergedStream = barStream || bazStream; 
    } 
    if (mergedStream) { 
     return mergedStream 
      .pipe(g.concat('bar-and-baz')) 
      .pipe(gulp.dest('./foo-output/')); 
    } 
}); 

Diese Neben Schritte, das die Notwendigkeit eines leeren Stream zu erzeugen, indem jedem der Ströme zu testen, und Zusammenführen sie nur dann, wenn beide vorhanden sind.

Allerdings würde ich immer noch gerne einen Weg kennen, einen leeren Stream im Schluck zu erstellen.

4

Eine Funktion einen leeren Strom zur Verwendung in gulp zum Erstellen (aufgelesen aus vinyl-fs Quelle), ist dies:

var through2 = require('through2'); 

function createEmptyStream() { 
    var pass = through2.obj(); 
    process.nextTick(pass.end.bind(pass)); 
    return pass; 
} 

Wenn barFiles = createEmptyStream() im Beispiel machen Es ist funktional das Gleiche.

Aktuelle Version von schluck (3.9.1) und Vinyl-fs (0.3.0) auf 2016.03.05 ermöglicht eine leere src Array (von meinem Test). Es verwendet etwas Ähnliches wie oben, um einen leeren Stream zu erstellen. Ihr Beispiel funktioniert (meist als Service-Leistung) in der aktuellen Versionen:

var eventStream = require('event-stream'); 
var gulp = require('gulp'); 
var g = require('gulp-load-plugins')(); 

function getBarFiles() { 
    return [ 
    ]; 
} 

function getBazFiles() { 
    return [ 
     'baz.txt' 
    ]; 
} 

gulp.task('foo', [], function() { 
    var barFiles = getBarFiles(); 
    var bazFiles = getBazFiles(); 
    var barStream = gulp.src(barFiles); 
    var bazStream = gulp.src(bazFiles); 

    return eventStream 
     .merge(barStream, bazStream) 
     .pipe(g.concat('bar-and-baz.txt')) 
     .pipe(gulp.dest('./')); 
}); 

gulp.task('default', [ 'foo' ]); 

Die Datei bar-and-baz.txt ist eine Verkettung von den Inhalten aller Dateien in den Klümpchen aus diesen beiden Funktionen zurückgegeben. Eine leere Liste von Globs wird akzeptiert.

+0

Jeder hat einen Einblick, warum sie die 'end'-Methode des Streams asynchron mit' process.nextTick' aufrufen, anstatt sie direkt nach dem Erstellen direkt aufzurufen. Da von meinen Tests mit Schluckaufgaben scheint die synchrone Version korrekt zu funktionieren. – lleaff

0

andere Lösung, die ganz gut meine Bedürfnisse erfüllt war zu verwenden gulp-tap:

var config = require('./config'); 
var gulp = require('gulp'); 
var tap = require('gulp-tap'); 
var concat = require('gulp-concat'); 
var uglify = require('gulp-uglify'); 

var noop = function() {}; 

gulp.task('mytask', function() { 
    return gulp.src('*.js') 
    .pipe(config.production ? uglify() : tap(noop)) 
    .pipe(concat('code.min.js')) 
    .pipe(gulp.dest('dist')); 
}); 

Dieses Sie einen leeren Stream erlaubt auf einfache Weise zu erstellen, die Sie in einem .pipe() passieren können, so müssen Sie nicht über eine if haben Äußerung.

Hinweis: Als ich herausgefunden nur, Sie sollten die tap(noop) in eine Variable nicht speichern und versuchen, es über mehrere Aufgaben zu verwenden, wie das eigentlich können Ihre Ströme mischen und erratische Verhalten führen.

1

Vielleicht ist meine Antwort zu einfach, aber ich hatte genau die gleiche Frage wie die OP, und ich war in der Lage, es zu lösen, ohne zusätzliche Module zu importieren:

if (platform != 'android') { 
    // Android doesn't need anything here 
    return gulp.src([]); // empty stream 
} 

Mit anderen Worten, gulp.src() doesn‘ t arbeiten, aber gulp.src([]) scheint gut zu funktionieren. Oder fehlt mir etwas?

+0

Was fügt dies zu der Frage hinzu (Was ist etwa 4 Jahre alt zu diesem Zeitpunkt), dass die anderen Antworten nicht? Tatsächlich [sieht diese Antwort sehr ähnlich] (https://stackoverflow.com/a/36126630/5827005) zu Ihrem aus. – GrumpyCrouton

+0

@GrumpyCrouton Es kann oberflächlich ähnlich aussehen, aber es ist nicht. Die Antwort, auf die Sie verweisen, verwendet ein zusätzliches Modul, 'event-stream'. Meine Antwort verwendet nur das, was bereits im Schluckmodul vorhanden ist. Für mich ist das ein wichtiger Unterschied. Warum sollte ich ein nicht verwandtes Modul reinziehen, nur um etwas zu erschaffen, das ich ohne es schon machen kann? – Dalbergia

+0

@GrumpyCrouton Was die Frage betrifft, würde ich sagen, dass die Vereinfachung der vorherigen Antworten mehr als genug ist. Und das Alter der Frage ist nicht relevant; SO-Fragen sollen eine Referenz für zukünftige Leser sein, nicht nur für die Person, die die Frage ursprünglich gestellt hat. – Dalbergia

Verwandte Themen