2014-09-01 12 views
13

SSCCE:Come si crea uno stream vuoto 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() o getBazFiles() può restituire un array vuoto, quali è non accettati da gulp.src(): Error: Invalid glob argument, qui la necessità di avvolgere la creazione del flusso con una condizione if.

Quindi la domanda è: come posso creare uno stream vuoto, in modo che possa essere unito all'altro vuoto su un flusso non vuoto?

+4

È possibile esaminare utilizzando ['gulp-util.noop'] (https://github.com/gulpjs/gulp-util#noop) per creare uno stream vuoto. – Chris

+0

@Chris quindi, "uno stream che non fa altro che passare i dati direttamente", non ha bisogno di avere un 'gulp.src' per il pipe through dei dati? – bguiz

+0

Questo è il modo in cui ho capito di agire. Tuttavia, non ho alcuna scadenza utilizzando questo metodo, quindi è necessario verificare se questo risponde alla tua domanda (motivo per cui l'ho postato come commento, piuttosto che come risposta). – Chris

risposta

0

Una soluzione:

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

Questo lato-passi la necessità di creare un flusso vuoto testando ogni flusso, e la loro unione solo quando entrambi sono presenti.

Tuttavia, mi piacerebbe ancora sapere un modo per creare un flusso vuoto in gulp.

4

Una funzione per la creazione di un flusso vuoto per uso in sorso (raccolte da vinil-fs source) è questo:

var through2 = require('through2'); 

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

Se si effettua barFiles = createEmptyStream() nell'esempio , è funzionalmente lo stesso.

versione attuale della gulp (3.9.1) e vinil-fs (0.3.0) su 2016/03/05 consente un array src vuoto (dal mio test). Usa qualcosa di simile a quanto sopra per creare un flusso vuoto. Il vostro esempio funziona (per lo più come-è) nelle versioni attuali:

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

Il file bar-and-baz.txt è una concatenazione dei contenuti di tutti i file nelle gocce tornati da queste due funzioni. Una lista vuota di glob è accettata.

+0

Chiunque ha idea del motivo per cui chiamano il metodo 'end' del flusso in modo asincrono con' process.nextTick' invece di chiamarlo direttamente subito dopo averlo creato? Perché dai miei test con le attività di Gulp la versione sincrona sembra funzionare correttamente. – lleaff

0

Un'altra soluzione che ha soddisfatto le mie esigenze abbastanza bene era quello di utilizzare 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')); 
}); 

Questo permette di creare facilmente un flusso vuoto che è possibile passare all'interno di un .pipe() in modo da non avere un if dichiarazione al di fuori.

Nota: Come ho appena capito, non è necessario memorizzare il tap(noop) in una variabile e tentare di utilizzarlo su più compiti che possono realmente mescolare i vostri corsi d'acqua e provocare il comportamento irregolare.

1

Forse la mia risposta è troppo semplicistico, ma ho avuto esattamente la stessa domanda come il PO, e sono stato in grado di risolverlo senza importare eventuali moduli aggiuntivi:

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

In altre parole, gulp.src() doesn' t lavoro, ma gulp.src([]) sembra funzionare bene. O mi sta sfuggendo qualcosa?

+0

Cosa aggiunge questo alla domanda (che ha circa 4 anni a questo punto) che le altre risposte no? In effetti, [questa risposta sembra molto simile] (https://stackoverflow.com/a/36126630/5827005) alla tua. – GrumpyCrouton

+0

@GrumpyCrouton Può sembrare superficialmente simile, ma non lo è. La risposta a cui fai riferimento utilizza un modulo aggiuntivo, 'event-stream'. La mia risposta usa solo ciò che è già presente nel modulo Gulp. Per me, questa è una differenza importante; perché dovrei voler inserire un modulo non correlato solo per creare qualcosa che posso già fare senza di esso? – Dalbergia

+0

@GrumpyCrouton Per quanto riguarda ciò che aggiunge alla domanda, direi che semplificare le risposte precedenti è più che sufficiente. E l'età della domanda non è pertinente; QUINDI domande sono pensate per essere un riferimento ai futuri lettori, non solo alla persona che originariamente aveva posto la domanda. – Dalbergia

Problemi correlati