2014-09-01 42 views
13

SSCCE:如何在Gulp中創建一個空的流?

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條件。

所以問題是,我該如何創建一個空的流, ,以便它可以與另一個空的非空流合併?

+4

你可以使用['gulp-util.noop'](https://github.com/gulpjs/gulp-util#noop)來創建一個空的流。 – Chris 2014-09-01 13:34:19

+0

@Chris所以,「一個只做數據傳遞的流」,不需要有'gulp.src'來管理數據? – bguiz 2014-09-01 23:37:57

+0

這就是我理解它的行爲。然而,我沒有使用這種方法的任何期限,所以你需要看看這是否回答你的問題(這就是爲什麼我發佈這個評論,而不是作爲答案)。 – Chris 2014-09-02 07:26:30

回答

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中創建空流。

4

一種用於在大口(從乙烯基-FS源收集)使用創建一個空的流的功能是這樣的:

var through2 = require('through2'); 

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

如果使在實施例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' ]); 

文件酒吧和baz.txt是來自這兩個函數返回的水珠所有文件的內容的串聯。一個空的球體列表被接受。

+0

任何人都知道爲什麼他們爲什麼會用'process.nextTick'異步調用流的'end'方法,而不是在創建它之後直接調用它? 因爲從我的吞吐任務測試中,同步版本似乎正常工作。 – lleaff 2017-05-26 12:14:13

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)到一個變量,並嘗試使用它在多任務,可能實際的混合流和導致異常行爲。

1

也許我的回答過於簡單,但我有完全一樣的問題爲OP,我是能夠解決它沒有導入任何其他模塊:

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

換句話說,gulp.src()沒有按」 t工作,但gulp.src([])似乎工作正常。或者我錯過了什麼?

+0

這是什麼增加了這個問題(這是大約4歲在這一點上)其他答案不?事實上,[這個答案看起來非常相似](https://stackoverflow.com/a/36126630/5827005)給你。 – GrumpyCrouton 2018-01-23 18:24:34

+0

@GrumpyCrouton它可能看起來表面上相似,但事實並非如此。你引用的答案使用了一個額外的模塊'event-stream'。我的回答只使用了gulp模塊中已經存在的內容。對我而言,這是一個重要的區別;爲什麼我想拉一個不相關的模塊來創建一些我已經可以不用的模塊? – Dalbergia 2018-01-24 17:17:20

+0

@GrumpyCrouton至於它增加了什麼問題,我會說簡化以前的答案是綽綽有餘。問題的年齡不相關; SO問題旨在爲未來的讀者提供參考,而不僅僅是最初提出問題的人。 – Dalbergia 2018-01-24 17:24:42

相關問題