Как создать пустой поток в 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
.
Итак, вопрос в том, как создать пустой поток,
так что его можно объединить с другим пустым в непустом потоке?
Ответы
Ответ 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([])
работает нормально. Или я что-то упускаю?
Ответ 3
Я использую это:
https://github.com/dominictarr/event-stream
es.merge([]);
Это работает!
Ответ 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('.');
Поскольку я предполагаю, что он должен просто передать текущий каталог в потоке без каких-либо действий над ним. Работает для меня.