2014-09-29 11 views
5

Sto usando Gulp per raccogliere front-matter (tramite il plugin gulp-front-matter) e poi, dopo averlo aggregato, lo sto salvando in un altro file. Tra gli altri dati, sto risparmiando un sacco di CSS. Ecco quello che ho per il mio compileCSS compito:Come si esegue un'attività "fine alla fine" ma solo alla fine dell'attività corrente?

var collected = []; 

gulp.src('./client/**/*.html') 
    .pipe(frontMatter({ property: 'meta', remove: true })) 
    .pipe(through.obj(function(file, enc, callback) { 
     var css = file.meta; 
     collected.push(css); 
    })) 
    .pipe(gulp.dest('./build/templates')) 
    .on('end', function() { 
     var cssPath = ['build', 'assets', 'css', 'compiled.css']; 
     fs.writeFileSync(cssPath.join(path.sep), cssPath); 
    }) 

;

L'attività funziona come previsto (nota, è una versione semplificata). Tutto funziona come previsto e ottengo un file compiled.css con tutti i CSS della parte anteriore. Tuttavia, ho trovato la necessità di usare il prefisso non solo sul mio normale file css ma anche su questo nuovo compilato.css. Così ho creato un compito prefix:

gulp.task('prefix', ['compileCSS', 'copy'], function() { 
    gulp.src('./build/assets/css/*.css') 
     .pipe(autoprefixer({ browsers: ['last 3 versions'] })) 
     .pipe(gulp.dest('build')) 
    ; 
}); 

Ora, il problema è che la funzione on('end' eseguito alla fine di tutti i compiti, non solo il compito compileCSS.

La mia domanda è, c'è un modo per iniettare un'attività tipo "alla fine" per ogni attività? O c'è un modo per usare gli stream in qualche modo (dato che l'ultimo task non è un flusso reale e non ne approfitta, non vedo come).

+0

Non è solo che vengono eseguiti contemporaneamente perché non è stata fornita una richiamata? https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md – RichieAHB

risposta

9

Non era la sequenza che era il problema, non stavo tornando il flusso che ha creato una condizione di competizione così una correzione come questo ha funzionato:

return gulp.src('./client/**/*.html') 
      .pipe(dosomething()); 
    \\ all other code 

Credo che il problema era che Gulp attende uno stream da eseguire prima di impostare il prossimo evento. Senza tornare a flussi o promesse, Gulp semplicemente esegue l'attività e non aspetta che finisca.

+0

se Gulp esegue semplicemente l'attività e non aspetta che finisca, come posso prendere la vera fine? Ho bisogno di questo perché se voglio eseguire una iniezione di "app" dopo l'iniezione del fornitore, devo prendere questo evento. – carmelolg

7

Si può provare run-sequence:

var runSequence = require('run-sequence'); 
gulp.task('mytask', function(cb) { 
    runSequence(
    ['parallel1', 'parallel2'], 
    'seq1', 
    'seq2', 
    cb 
); 
}); 

Se volete qualcosa di più legato al vostro gulpfile, si dovrebbe includere alla tua domanda.

+1

ha finito per essere un problema con il fatto che non ho mai restituito nessuno dei flussi che significa quel gulp non ho mai saputo quando il compito era finito. – antjanus

+0

@antjanus Dovresti pubblicare una risposta e contrassegnarla come accettata. – Florent

+1

Devo aspettare almeno 2 giorni per accettare la mia risposta quindi sono quasi arrivato! :) – antjanus