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

时间:2014-09-01 12:04:17

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

getBarFiles()getBazFiles()可能会返回一个空数组, gulp.src()允许 Error: Invalid glob argument, 因此需要用if条件包装流的创建。

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

6 个答案:

答案 0 :(得分:5)

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

var through2 = require('through2');

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

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

2016-03-05 的当前版本的 gulp(3.9.1) vinyl-fs(0.3.0)允许一个空的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是从这两个函数返回的globs中所有文件内容的串联。接受一个空的清单列表。

答案 1 :(得分:3)

也许我的答案太简单了,但我和OP有完全相同的问题,而且我能够在不导入任何其他模块的情况下解决它:

repaint();

换句话说,if (platform != 'android') { // Android doesn't need anything here return gulp.src([]); // empty stream } 不起作用,但gulp.src()似乎工作正常。或者我错过了什么?

答案 2 :(得分:2)

如何使用:

return gulp.src('.');

我假设它应该只是在流中传递当前目录,而不对其进行任何操作。为我工作。

答案 3 :(得分:1)

我用这个:

https://github.com/dominictarr/event-stream

es.merge([]);

有效!

答案 4 :(得分: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/'));
    }
});

这一方面需要通过测试每个流来创建一个空流,并仅在两者都存在时合并它们。

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

答案 5 :(得分: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)存储到变量中并尝试在多个任务中使用它,因为这可能实际上混合了您的流并导致不稳定的行为。