2014-09-29 5 views
5

Ich benutze Gulp, um Front-Materie zu sammeln (via Gulp-Front-Materie-Plugin) und dann, nach der Aggregation, ich speichere es in eine andere Datei. Neben anderen Daten speichere ich eine Menge CSS. Hier ist, was ich für meine compileCSS Aufgabe haben:Wie laufen Sie einen Schluck "am Ende" Aufgabe aber nur am Ende der aktuellen Aufgabe?

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

;

Die Aufgabe funktioniert wie erwartet (beachten Sie, es handelt sich um eine vereinfachte Version). Alles funktioniert wie erwartet und ich bekomme eine compiled.css Datei mit allen Front-Materie-CSS. Allerdings musste ich den Präfix nicht nur in meiner regulären CSS-Datei, sondern auch in dieser neuen kompilierten.css verwenden. Also habe ich eine prefix Aufgabe:

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

Nun ist das Problem, dass die on('end' Funktion läuft am Ende aller Aufgaben, nicht nur die compileCSS Aufgabe.

Meine Frage ist, gibt es eine Möglichkeit, eine "am Ende" Art Aufgabe für jede Aufgabe zu injizieren? Oder gibt es eine Möglichkeit, Streams irgendwie zu verwenden (da die letzte Task kein tatsächlicher Stream ist und keinen Vorteil daraus zieht, sehe ich nicht wie).

+0

Ist es nicht nur, dass sie gleichzeitig ausgeführt werden, weil Sie keinen Rückruf bereitgestellt haben? https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md – RichieAHB

Antwort

9

Es ist nicht die Folge war, dass das Problem war, war ich nicht der Strom zurückkehrt, die eine Race-Bedingung erstellt so ein Update wie folgt gearbeitet:

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

ich das Problem war, vermuten, dass Gulp wartet Ein Stream, der vor dem nächsten Ereignis ausgeführt werden muss. Ohne zurückkehrende Ströme oder Versprechen, führt Gulp einfach die Aufgabe aus und wartet nicht darauf, dass es beendet wird.

+0

Wenn Gulp einfach die Aufgabe ausführt und nicht darauf wartet, dass sie endet, wie kann ich das echte Ende erreichen? Ich brauche das, denn wenn ich eine Injektion von "App" nach der Injektion des Anbieters ausführen möchte, muss ich dieses Ereignis abfangen. – carmelolg

7

Sie können run-sequence versuchen:

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

Wenn Sie etwas mehr im Zusammenhang mit Ihrer gulpfile möchten, können Sie es zu Ihrer Frage enthalten sollte.

+1

es endete damit, ein Problem mit der Tatsache zu sein, dass ich nie irgendwelche der Ströme zurückgab, die diesen Schluck meinen wusste nie, wann die Aufgabe beendet war. – antjanus

+0

@antjanus Sie sollten eine Antwort posten und als akzeptiert markieren. – Florent

+1

Ich muss mindestens 2 Tage warten, um meine eigene Antwort zu akzeptieren, also bin ich fast da! :) – antjanus