你如何在Gulp中创建一个空流?

bgu*_*uiz 18 javascript stream 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/'));
});
Run Code Online (Sandbox Code Playgroud)

getBarFiles()或者getBazFiles()可以返回一个空数组,这是被允许gulp.src():Error: Invalid glob argument,因此需要以包裹流的创建与if条件.

所以问题是,如何创建一个空流,以便它可以与非空流上的其他空合并?

Art*_*ień 7

如何使用:

return gulp.src('.');
Run Code Online (Sandbox Code Playgroud)

对于较新的 Gulp,您可能需要添加allowEmpty: true如下选项:

return gulp.src('.', {allowEmpty: true});
Run Code Online (Sandbox Code Playgroud)

我认为它应该只传递流中的当前目录而不对其进行任何操作。为我工作。


dat*_*man 5

用于创建用于gulp的空流(从乙烯基-fs源收集)的功能是:

var through2 = require('through2');

function createEmptyStream() {
    var pass = through2.obj();
    process.nextTick(pass.end.bind(pass));
    return pass;
}
Run Code Online (Sandbox Code Playgroud)

如果你在示例中使barFiles = createEmptyStream(),它在功能上是相同的.

的当前版本吞(3.9.1)乙烯基-FS(0.3.0)关于2016年3月5日允许空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' ]);
Run Code Online (Sandbox Code Playgroud)

文件bar-and-baz.txt是从这两个函数返回的globs中所有文件内容的串联.接受一个空的globs列表.


bgu*_*uiz 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/'));
    }
});
Run Code Online (Sandbox Code Playgroud)

这避免了通过测试每个流并仅在两个流都存在时才合并它们来创建空流的需要。

但是,我仍然想知道一种在 gulp 中创建空流的方法。