Подтвердить что ты не робот

Как создать пустой поток в Gulp?

SSCCE:

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.

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

4b9b3361

Ответ 1

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

var through2 = require('through2');

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

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

Текущая версия gulp (3.9.1) и vinyl-fs (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' ]);

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

Ответ 2

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

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

Другими словами, gulp.src() не работает, но gulp.src([]) работает нормально. Или я что-то упускаю?

Ответ 4

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

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

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

Однако мне все равно хотелось бы узнать, как создать пустой поток в gulp.

Ответ 5

Еще одно решение, которое удовлетворило мои потребности, состояло в том, чтобы использовать 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) в переменной и пытаться использовать ее для нескольких задач, поскольку это может фактически смешивать ваши потоки и вызывать неустойчивое поведение.

Ответ 6

Как насчет использования:

return gulp.src('.');

Поскольку я предполагаю, что он должен просто передать текущий каталог в потоке без каких-либо действий над ним. Работает для меня.