2014-06-30 18 views
8

Şu anda, şablonlarım önceden hazırlayan Gulp'te geçici bir dosya oluşturuyorum. Ondan sonra, onları bir javascript dosyası haline getirip uyandırıyorum. Ama geçici dosyalara sahip olmamayı tercih ederim. Gulp'te 'dinamik' bir kaynağa sahip olmanın bir yolu var mı? Akımları birleştirmeyi denedim, ama boşuna.Başka bir görevden atlama kaynağı

örnek kod:

gulp.task('template', function() { 
    gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()) 
    .pipe(concat('tpl.js')) // make sure to only do concat after 
    .pipe(gulp.dest('tmp')); 
}); 

gulp.task('uglify', ['template'], function() { 
    gulp.src(['./tmp/tpl.js', './src/js/app.js']) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')) 
}); 
+1

'gulp.src' yani' dönüş gulp.src önce 'return' koymak unutmayın (...) Böylece görev, görev tamamlandığında yerine getirilen bir söz verir. – RustyToms

cevap

12

Görevler doğrudan diğer görevler içine taşınıyor olamaz, ancak akışları birleştirmek için event-stream kullanabilirsiniz: yapmanız gerekir Yani teorik

var es = require('event-stream'); 
function template() { 
    return gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()); 
} 

function appjs() { 
    return gulp.src(['./src/js/app.js']); 
} 

gulp.task('uglify', function() { 
    return es.merge(template(), appjs()) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')); 
}); 
+0

Bu cevap eski ve yanlıştır, lütfen gulp.src ile birlikte kullandığım yeri {passthrough: true}. –

11

Bu, 3.8.0 ya da daha yüksek sürümü ile. Here is the changelog with an example of the feature. değişmek itibaren

:

gulp.src artık yazılabilir bir passthrough olduğunu, bu

Yani bir görev olabilir herhangi bir noktada boru hattına dosyaları eklemek için kullanabilirsiniz demektir böyle:

gulp.task('template', function() { 
    return gulp.src('./src/tpl/*.hbs') 
    .pipe(ember()) 
    .pipe(concat('tpl.js')) 
    .pipe(gulp.src('./src/js/app.js', { passthrough: true })) 
    .pipe(uglify()) 
    .pipe(concat('epg.js')) 
    .pipe(gulp.dest('dist')) 
}); 

Maalesef hata çeşit var gibi görünüyor Belirli globleri işlemede sorun yaşadığı yerde, here ve here numaralı konulara bakın. Umarım yakında çözülürler. Bu, projemde bunu kullanmamı engelliyor, ancak sizinkinde sadece tek bir dosya ekliyorsunuz, bu yüzden deneyin ve belki işe yarayacak. Herkes hala bu konuda size geliyor için bu işe yaramazsa

şifreli mod seçeneği dahil etmek merge-stream https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md

Düzenlendi kullanmayı deneyin Bjorn Tipling

+0

Güzel çözüm. +1. Bu yorumu açıklığa kavuşturabilir misiniz: "sadece sonra concat yapmak emin olun".Kinda anlam ifade etmiyor… Bu, “Ember'den sonra” demek mi, yoksa “yeni bir kaynak oluşturmadan önce uydurduğundan emin ol” mu? Üzgünüm, belli ki anladığımdan emin olmak istiyorum. – mhulse

+1

@mhulse, hiçbir fikrim yok, OP'ye sormalısın. Kendim hakkında kafam karıştı. Sadece OP'in kodundan kopyaladım. Bu çözümü kaldırmak için cevabımı düzenleyeceğim, çünkü bu çözümle ilgili değil. – RustyToms

+0

Doh! Benim hatam! Bunu şimdiye kadar görmedim. Açıklama için ve cevap için teşekkürler. :) – mhulse

1

tarafından bahsedilen gulp.src için Bir görev akışına ek dosyalar eklemek için gulp.src'yi tamamen kullanabilir. Bir seçenek olarak { passthrough: true } eklemeniz yeterlidir.

gulp.task(tasks.SASS,() => { 
    return gulp.src(paths.css.src) 
    .pipe(sass().on('error', sass.logError)) 
    .pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true })) 
    .pipe(concat('styles.css')) 
    .pipe(gulp.dest(paths.css.dest)) 

Bu soruya önemli olan tek çizgidir: Burada çalışan bir örnektir

.pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true })) 

Bu detaylar sorusuna gereksizdir, ancak durumda karışıklık var, ben CSS dosyaları alıyorum SASS aracılığıyla, görevin bir parçası olarak oluşturulduktan sonra web paketi tarafından oluşturulmuş SASS dosyaları ile (vue dosyalarından ayıklanan) ayrı bir işte birleştirme. Benim tasks ve paths değişkenlerim sabit kodlanmış dizeleri kullanmıyor (çoğu zaman).

Not, ben yudum 4,0 kullanılan ama bu konularda sanmıyorum passthrough was added to master in 2015

+2

Vinil-fs'nin eski bir sürümüne bağlı olan 3 numaralı gulp ile işe yaramadı. Npm install --save-dev vinyl-fs 'yapmam gerekiyordu ve 'gulp.src' yerine 'require (' vinyl-fs '). Src' ile değiştirdim. – alarive