2014-06-10 8 views
6

Probabilmente sto provando a fare in modo che il gulp faccia qualcosa che non sia idiomatico, ma qui va. Voglio che la mia attività di compilazione venga eseguita solo se i file di origine sono più recenti del file di output.In Gulp, come faccio a eseguire un'attività su un solo file se uno dei file multipli è più recente?

In gulp, sembra prassi normale creare un'attività di compilazione che viene sempre eseguita e quindi impostare un'attività di controllo per eseguire solo l'attività di generazione quando alcuni file cambiano. Va bene, ma significa che tu hai sempre build alla prima esecuzione.

Quindi, è possibile fare ciò che voglio? Ecco quello che ho finora (più recente è gulp-più recente):

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

});

Ho provato a utilizzare gulpif, ma non sembra funzionare se non ci sono file in cui iniziare.

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

Tuttavia, la mia funzione condizione non è anche chiamato perché non ci sono i file su cui chiamarlo. gulpif chiama il flusso di verità in questo caso, quindi LibSource viene aggiunto al mio stream, che non è quello che voglio.

Forse fare tutto questo in un singolo stream non è la chiamata giusta, poiché l'unica ragione per cui sto passando quei file attraverso il filtro "gulp-newer" è vedere se qualcuno di questi è più recente. Quindi li scarto e li sostituisco con un altro file. La mia domanda è ancora valida.

risposta

6

È possibile scrivere il proprio tramite/trasformare flusso di gestire la condizione in questo modo:

// 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

Impressionante! Grazie! – Taytay

0

Non è necessario creare prima. Nella tua "prima esecuzione" puoi eseguire solo il compito di sorveglianza da cui esegui tutti gli altri.

esempio:

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

Questo permetterà di evitare l'esecuzione di qualsiasi compito all'avvio. Spero che questo ti possa aiutare.

0

Posso suggerire gulp-newy in cui è possibile manipolare il percorso e il nome del file in una propria funzione. Quindi, usa semplicemente la funzione come callback allo newy(). Questo ti dà il controllo completo dei file che desideri confrontare.

Questo permetterà 1: 1 o molti a 1 mette a confronto.

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

Grazie a @manu. In che modo newy è diverso da 'newer' che sto usando sopra? In particolare, una volta scoperto che ci sono file più recenti, stavo cercando di capire come fare una chiamata se _questo dei file fossero più recenti, e questa è la risposta che mi ha dato @ kyle-robinson-young. Sono nuovo di 'gulp', quindi forse' newy' sta facendo questo per me in qualche modo e l'ho perso? – Taytay

+0

Se questo funziona per te, allora stai bene. 'newey' è solo un'alternativa in caso di problemi. Dispiace per la confusione. – dman

Problemi correlati