2014-09-01 23 views
13

SSCCE:Gulp'de boş bir akışı nasıl yaratıyorsunuz?

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() veya getBazFiles() boş bir dizi döndürebilir, gulp.src() tarafından izin olup: Error: Invalid glob argument, bir if koşulu ile akımının oluşturulmasını sarmak için dolayısıyla gerekir.

Soru şu ki, boş olmayan bir akışta diğer boş ile birleştirilebilmesi için boş bir akış, nasıl oluşturabilirim?

+4

Boş bir akış oluşturmak için ['gulp-util.noop'] (https://github.com/gulpjs/gulp-util#noop) kullanarak bakabilirsiniz. – Chris

+0

@Chris, "verileri düz bir şekilde iletmekten başka bir şey yapmayan bir akış", veriyi aktarmak için bir "gulp.src" ye sahip olmak zorunda değil mi? – bguiz

+0

Bu şekilde davranmasını anlıyorum. Ancak, bu yöntemi kullanarak herhangi bir beklentim yok, bu yüzden sorunuzun yanıtlanıp yanıtlanmadığını kontrol etmelisiniz (bu yüzden bunu bir yanıt olarak değil, yorum olarak göndermiştim). – Chris

cevap

0

Bir çözüm:

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

Bu akışların her test, ve her ikisi de mevcut olduğu ancak bunları birleştirerek boş akım oluşturmak için ihtiyacı yan adımları tekrarlayın. Bununla birlikte, hala gulpda boş bir akım yaratmanın bir yolunu bilmek isterim.

4

(vinil-fs kaynak panoda) gulp kullanım için boş bir akış oluşturmak için bir fonksiyon, şudur: örnekte barFiles = createEmptyStream() yaparsanız

var through2 = require('through2'); 

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

İşlevsel olarak aynıdır. gulp (3.9.1) ve vinil-fs (0.3.0) 2016-03-05tarihinde yapılmıştır

anki sürümü (my testlerden) boş bir src dizi sağlar. Boş bir akış oluşturmak için yukarıdakilere benzer bir şey kullanır. Sizin örnek, geçerli sürümlerinde (çoğunlukla olduğu gibi) çalışır:

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' ]); 

dosya bar-ve-baz.txt bu iki işlevler dönen Neználkovo tüm dosyaların içeriğinin bir birleşimidir. Boş bir glob listesi kabul edilir.

+0

Herkes, doğrudan oluşturduktan hemen sonra doğrudan çağırmak yerine, 'process'nextick ile eşzamansız olarak' end' yöntemini neden çağırdıklarına dair bir içgörüye sahip midir? Yem görevleriyle yaptığım testlerden dolayı eşzamanlı sürüm düzgün çalışıyor gibi görünüyor. – lleaff

0

oldukça iyi benim ihtiyaçlarını bir araya geldi kullanmaktı Başka bir çözüm gulp-tap: Bu kolayca bir .pipe() içine geçebilir boş bir akış oluşturmak için olanak sağlar

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')); 
}); 

böylece bir if olması gerekmez dışında ifade.

Not: Sadece anladım gibi, bir değişken içine tap(noop) depolamak ve bu aslında akışları karıştırmak ve düzensiz davranışlara neden olabileceği için birden görevlerin karşısında kullanmaya çalışmamalıdır.

1

Belki cevabım çok basit, ama OP tamamen aynı soru vardı ve ben herhangi bir ek modüller ithal etmeden bunu çözmek başardı: 'gulp.src() doesn Diğer bir deyişle,

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

Çalışmak, ancak gulp.src([]) iyi çalışıyor gibi görünüyor. Yoksa bir şey mi özlüyorum?

+0

da çalıştı. Bu, diğer cevapların vermediği soruyu (Bu noktada kabaca 4 yaşında olan) neye ekler? Aslında, [bu cevap çok benzer görünüyor] (https://stackoverflow.com/a/36126630/5827005) sizinkilere. – GrumpyCrouton

+0

@GrumpyCrouton Yüzeysel olarak benzer görünebilir, ama öyle değil. Başvurduğunuz cevap, ek bir modül olan 'event-stream' kullanmaktadır. Cevabım sadece gulp modülünde bulunanları kullanıyor. Bana göre bu önemli bir fark; neden alakasız bir modülde sadece onsuz yapabileceğim bir şey yaratmak istedim? – Dalbergia

+0

@GrumpyCrouton Bu soruya ne eklediyse, önceki cevapları sadeleştirmekten çok daha fazlasını söyleyebilirim. Ve sorunun yaşı uygun değil; SO soruları, sadece soruyu soran kişiye değil, gelecekteki okuyuculara bir referans olması anlamına gelir. – Dalbergia