2014-09-01 15 views
13

SSCCE:Jak utworzyć pusty strumień w 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() lub getBazFiles() może powrócić pustą tablicę, która jest nie dopuszcza gulp.src(): Error: Invalid glob argument, stąd konieczność owinąć tworzenia strumienia ze stanem if.

Pytanie więc, jak utworzyć pusty strumień, , aby można go było scalić z innym pustym strumieniem niepustym?

+4

Możesz zajrzeć do używania ['gulp-util.noop'] (https://github.com/gulpjs/gulp-util#noop), aby utworzyć pusty strumień. – Chris

+0

@Chris tak, "strumień, który nic nie robi, ale przekazuje dane bezpośrednio", nie musi mieć "gulp.src" do danych potoku przez? – bguiz

+0

Tak to rozumiem, żeby działać. Nie korzystam jednak z tej metody, więc musisz sprawdzić, czy to odpowiada na twoje pytanie (dlatego opublikowałem to jako komentarz, a nie jako odpowiedź). – Chris

Odpowiedz

0

Jedno rozwiązanie:

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

Ten boczny krokach potrzebę stworzenia pustej strumienia poprzez testowanie każdego ze strumieni i ich połączenia tylko wtedy, gdy obydwa składniki są obecne.

Chciałbym jednak wiedzieć, w jaki sposób utworzyć pusty strumień w łyku.

4

Funkcja utworzenie pustej strumienia do stosowania w łyku (uzyskanej z winylu-fs źródło) to:

var through2 = require('through2'); 

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

Jeśli się barFiles = createEmptyStream() w przykładzie jest funkcjonalnie taki sam.

Aktualna wersja haustem (3.9.1) i winylu-fs (0.3.0) na 05/03/2016 pozwala na pustej tablicy src (z mojego testowania). Używa czegoś podobnego do powyższego, aby utworzyć pusty strumień. Twój przykład działa (głównie jak jest) w aktualnych wersjach:

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

Plik bar-a-baz.txt jest połączeniem zawartości wszystkich plików w globs powracających z tych dwóch funkcji. Dopuszczalna jest pusta lista globów.

+0

Każdy ma wgląd w to, dlaczego nazywają oni metodę "końca" strumienia asynchronicznie z 'process.nextTick' zamiast wywoływać ją bezpośrednio zaraz po utworzeniu? Ponieważ z moich testów z zadaniami łyków synchroniczna wersja wydaje się działać poprawnie. – lleaff

0

Innym rozwiązaniem, które spełnił moje potrzeby całkiem dobrze było wykorzystanie 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')); 
}); 

To pozwala łatwo utworzyć pusty strumień, który można przekazać wewnątrz .pipe() więc nie trzeba mieć if oświadczenie na zewnątrz.

Uwaga: Jak tylko zorientowali się, nie należy przechowywać tap(noop) do zmiennej i próbować używać go w wielu zadań, które mogą rzeczywiście mieszać strumienie i spowodować nieprawidłowe działanie.

1

Może moja odpowiedź jest zbyt uproszczone, ale miałem dokładnie to samo pytanie jak PO, i udało mi się go rozwiązać bez importowania dodatkowych modułów:

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

Innymi słowy, gulp.src() robi” działa, ale wydaje się, że gulp.src([]) działa dobrze. Czy może czegoś brakuje?

+0

Co to dodaje do pytania (które ma mniej więcej 4 lata w tym momencie), że inne odpowiedzi nie? W rzeczywistości [ta odpowiedź wygląda bardzo podobnie] (https://stackoverflow.com/a/36126630/5827005) do twojej. – GrumpyCrouton

+0

@GrumpyCrouton Może wyglądać powierzchownie podobnie, ale tak nie jest. Odpowiedź, na którą się powołujesz, wykorzystuje dodatkowy moduł "strumień zdarzeń". Moja odpowiedź wykorzystuje tylko to, co jest już obecne w module gulp. Dla mnie to ważna różnica; dlaczego miałbym chcieć wciągnąć niepowiązany moduł tylko po to, by stworzyć coś, co już mogę zrobić bez niego? – Dalbergia

+0

@GrumpyCrouton Co do tego, co dodaje do pytania, powiedziałbym, że uproszczenie poprzednich odpowiedzi jest więcej niż wystarczające. Wiek pytania nie ma znaczenia; Pytania SO są przeznaczone dla przyszłych czytelników, a nie tylko dla osoby, która pierwotnie zadała pytanie. – Dalbergia

Powiązane problemy