2014-06-10 16 views
6

Muhtemelen budalalık yapan bir şey yapmamaya çalışıyorum, ama işte gidiyor. Oluşturma görevimin yalnızca kaynak dosyaların çıktı dosyasından daha yeni olması durumunda çalışmasını istiyorum.Gulp'de, birden çok dosya daha yeni olduğunda bir dosyayı yalnızca bir dosyada nasıl çalıştırırım?

Gulp'ta, her zaman çalışan bir derleme görevi oluşturmak ve ardından belirli dosyalar değiştiğinde bu derleme görevini çalıştırmak için bir saat görevi ayarlamak standart uygulama gibi görünüyor. Sorun değil, ama ilk seferde her zaman yapman gerektiği anlamına geliyor.

İstediğimi yapmak mümkün mü? İşte ben bugüne kadar bu var (daha yeni yudum-yeniyse):

gulp.task('build_lib', function() { 

return gulp.src(["app/**/*.ts"]) 
    .pipe(newer("out/outputLib.js")) //are any of these files newer than the output? 

** NEED SOMETHING HERE ** 
    how do I say, "If I got _any_ files from the step before, replace all of them with a single hardcoded file "app/scripts/LibSource.ts" "? 

    .pipe(typescript({ 
     declaration: true, 
     sourcemap: true, 
     emitError: false, 
     safe: true, 
     target: "ES5", 
     out: "outputLib.js" 
    })) 
    .pipe(gulp.dest('out/')) 

});

Gulpif kullanmayı denedim, ancak başlayacak herhangi bir dosya yoksa işe yaramaz.

.pipe(gulpif(are_there_any_files_at_all, 
     gulp.src(["app/scripts/LibSource.ts"]))) 

Ancak, durumumun işlevi bile çağrılacak bir dosya olmadığı için çağrılmıyor. gulpif bu durumda gerçek akışı çağırıyor, bu yüzden LibSource benim akışıma ekleniyor, istediğim bu değil.

Belki de bunların tümünü tek bir akışta yapmak gerçekten doğru çağrı değil, çünkü bu dosyaları "gulp-newer" süzgecinden geçirmenin tek nedeni, bunların daha yeni olup olmadığını görmek. Onları atıp başka bir dosyayla değiştiriyorum. Benim sorum yine de duruyor.

cevap

6

Sen şöyle durumunu ele akışı dönüştürmek/üzerinden kendi yazabilirsiniz:

// Additional core libs needed below 
var path = require('path'); 
var fs = require('fs'); 
// Additional npm libs 
var newer = require('gulp-newer'); 
var through = require('through'); 
var File = require('vinyl'); 

gulp.task('build_lib', function() { 
    return gulp.src(["app/**/*.ts"]) 
    .pipe(newer("out/outputLib.js")) 
    .pipe(through(function(file) { 
     // If any files get through newer, just return the one entry 
     var libsrcpath = path.resolve('app', 'scripts', 'LibSource.ts'); 
     // Pass libsrc through the stream 
     this.queue(new File({ 
     base: path.dirname(libsrcpath), 
     path: libsrcpath, 
     contents: new Buffer(fs.readFileSync(libsrcpath)) 
     })); 
     // Then end this stream by passing null to queue 
     // this will ignore any other additional files 
     this.queue(null); 
    })) 
    .pipe(typescript({ 
     declaration: true, 
     sourcemap: true, 
     emitError: true, 
     safe: true, 
     target: "ES5", 
     out: "outputLib.js" 
    })) 
    .pipe(gulp.dest('out/')); 
}); 
+0

Müthiş! Teşekkürler! – Taytay

0

İlk önce oluşturmanız gerekmez. 'İlk koşuşunuzda yalnızca diğerlerini koşturacağınız saat görevini çalıştırabilirsiniz.

örnek:

// Create your 'watch' task 
gulp.task('watch', function() { 
    gulp.watch('scripts/*.js', [ 'lint', 'test', 'scripts' ]); 
    gulp.watch('styles/sass/*.scss', [ 'sass_dev' ]); 
}); 

// On your first run you will only call the watch task 
gulp.task('default', [ 'watch' ]); 

Bu başlangıçta herhangi bir görev çalışan önleyecektir. Umarım bu sana yardımcı olur.

0

Ben kendi işlevinde yolunu ve dosya adını işleyebilirsiniz gulp-newy önerebilir. Ardından, işlevi newy()'a geri arama olarak kullanın. Bu, karşılaştırmak istediğiniz dosyaların tam kontrolünü sağlar.

Bu, 1: 1 veya çoktan 1 karşılaştırmaya izin verir.

newy(function(projectDir, srcFile, absSrcFile) { 
    // do whatever you want to here. 
    // construct your absolute path, change filename suffix, etc. 
    // then return /foo/bar/filename.suffix as the file to compare against 
} 

enter image description here

+0

Teşekkürler @dman. Newy, yukarıda kullandığımdan daha yeni olandan nasıl farklı? Özellikle, daha yeni dosyalar olduğunu öğrendiğimde, dosyaların daha yeni olsaydı nasıl çağrı yapılacağını anlamaya çalışıyordum ve bu da @ kyle-robinson-young'un bana verdiği cevap. Ben 'gulp' için yeniyim, belki de 'newy' bunu benim için bir şekilde yapıyor ve özledim mi? – Taytay

+0

Bu sizin için çalışıyorsa, o zaman cezanız. 'newey' herhangi bir sorununuz varsa sadece bir alternatiftir. Karışıklık için özür dilerim. – dman

İlgili konular