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
条件包装流的创建。
所以问题是,如何创建一个空流, 以便它可以与非空流上的其他空合并?
答案 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)
答案 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)
存储到变量中并尝试在多个任务中使用它,因为这可能实际上混合了您的流并导致不稳定的行为。