2014-09-01 3 views
13

SSCCE:Как создать пустой поток в 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() или getBazFiles() может возвращать пустой массив, который не разрешено gulp.src(): Error: Invalid glob argument, поэтому необходимо обернуть создание потока с if состоянии.

Итак, вопрос в том, как создать пустой поток, , чтобы он мог быть слит с другим пустым в непустом потоке?

+4

Чтобы создать пустой поток, вы можете использовать ['gulp-util.noop'] (https://github.com/gulpjs/gulp-util#noop). – Chris

+0

@Chris Итак, «поток, который ничего не делает, кроме как передавать данные прямо», не нужно иметь «gulp.src» для передачи данных через данные? – bguiz

+0

Вот как я понимаю это действовать. Однако у меня нет возможности использовать этот метод, поэтому вам нужно будет выяснить, отвечает ли это на ваш вопрос (поэтому я разместил это как комментарий, а не как ответ). – Chris

ответ

0

Одно из решений:

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

Эта сторона шаги в необходимость создания пустого потока путем тестирования каждого из потоков, и слияние их только тогда, когда присутствуют оба.

Однако я все равно хотел бы узнать способ создания пустого потока в глотке.

4

Функция для создания пустого потока для использования в глотке (почерпнутые из винил-фс источник) заключается в следующем:

var through2 = require('through2'); 

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

Если вы barFiles = createEmptyStream() в примере , это функционально то же самое.

Текущая версия глотка (3.9.1) и винил-фс (0.3.0) на 2016-03-05 позволяет пустой массив Src (из моего тестирования). Для создания пустого потока он использует нечто похожее на приведенное выше. Ваш пример работает (в основном, как есть) в текущих версиях:

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

Файл штрих-и-baz.txt представляет собой конкатенацию содержимого всех файлов в комках, возвращенных из этих двух функций. Принимается пустой список глобусов.

+0

Кто-нибудь знает, почему они называют асинхронно методом «end» потока с 'process.nextTick', а не просто называть его прямо сразу после его создания? Потому что из моих тестов с задачами gulp синхронная версия работает правильно. – lleaff

0

Другое решение, что встретил мои потребности достаточно хорошо, чтобы использовать 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')); 
}); 

Это позволяет легко создать пустой поток, который вы можете пройти внутрь .pipe(), так что вы не должны иметь if заявление снаружи.

Примечание: Как я только понял, вы не должны хранить tap(noop) в переменную и пытаться использовать его на несколько задач, которые могут на самом деле смешивать потоки и привести к неправильному поведению.

1

Может быть, мой ответ слишком упрощенным, но у меня был точно такой же вопрос, как ОП, и я был в состоянии решить без импортирования каких-либо дополнительных модулей:

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

Другими словами, gulp.src() Безразлично» t работа, но gulp.src([]) похоже работает хорошо. Или я чего-то не хватает?

+0

Что это добавляет к вопросу (которому примерно 4 года на данный момент), что другие ответы не делают? Фактически [этот ответ выглядит очень похожим] (https://stackoverflow.com/a/36126630/5827005) на ваш. – GrumpyCrouton

+0

@GrumpyCrouton Он может выглядеть внешне похожим, но это не так. Ответ, на который вы ссылаетесь, использует дополнительный модуль «event-stream». Мой ответ использует только то, что уже присутствует в модуле глотки. Для меня это важная разница; почему я хотел бы потянуть в несвязанный модуль только для создания чего-то, что я могу уже сделать без него? – Dalbergia

+0

@GrumpyCrouton Что касается того, что он добавляет к вопросу, я бы сказал, что упростить предыдущие ответы более чем достаточно. И возраст вопроса не имеет значения; Вопросы SO предназначены для ссылок на будущих читателей, а не только на человека, который первоначально задал вопрос. – Dalbergia

Смежные вопросы