410 Stimmen

Wie man Gulp-Aufgaben nacheinander nacheinander ausführt

Im Ausschnitt so:

gulp.task "coffee", ->
    gulp.src("src/server/**/*.coffee")
        .pipe(coffee {bare: true}).on("error",gutil.log)
        .pipe(gulp.dest "bin")

gulp.task "clean",->
    gulp.src("bin", {read:false})
        .pipe clean
            force:true

gulp.task 'develop',['clean','coffee'], ->
    console.log "run something else"

In develop Aufgabe möchte ich clean ausführen und nachdem dies erledigt ist, coffee ausführen und wenn das erledigt ist, etwas anderes ausführen. Aber ich kann das nicht herausfinden. Dieser Abschnitt funktioniert nicht. Bitte beraten.

415voto

OverZealous Punkte 38722

Standardmäßig führt Gulp Aufgaben gleichzeitig aus, es sei denn, sie haben explizite Abhängigkeiten. Dies ist nicht sehr nützlich für Aufgaben wie clean, bei denen Sie nicht abhängen möchten, aber sie müssen vor allem anderen ausgeführt werden.

Ich habe das Plugin run-sequence speziell geschrieben, um dieses Problem mit Gulp zu beheben. Nach der Installation verwenden Sie es so:

var runSequence = require('run-sequence');

gulp.task('develop', function(done) {
    runSequence('clean', 'coffee', function() {
        console.log('Führe etwas anderes aus');
        done();
    });
});

Sie können die vollständigen Anweisungen in der README des Pakets lesen — es unterstützt auch das gleichzeitige Ausführen einiger Aufgabensets.

Bitte beachten Sie, dass dies in der nächsten Hauptversion von Gulp (effektiv) behoben wird, da sie die automatische Abhängigkeitsreihenfolge vollständig eliminieren und Tools ähnlich wie run-sequence bereitstellen, um die Ausführungsreihenfolge manuell festzulegen.

Das ist jedoch eine große Änderung, daher gibt es keinen Grund zu warten, wenn Sie run-sequence bereits heute verwenden können.

377voto

Mathieu Borderé Punkte 4367

Die einzige gute Lösung für dieses Problem finden Sie in der Gulp-Dokumentation:

var gulp = require('gulp');

// nimmt eine Rückruffunktion entgegen, damit der Engine bekannt ist, wann diese abgeschlossen sein wird
gulp.task('one', function(cb) {
  // etwas machen -- asynchron oder nicht
  cb(err); // wenn err nicht null und nicht undefined ist, wird die Orchestrierung gestoppt und 'two' wird nicht ausgeführt
});

// legt fest, dass eine abhängige Aufgabe abgeschlossen sein muss, bevor diese beginnt
gulp.task('two', ['one'], function() {
  // Aufgabe 'one' ist jetzt erledigt
});

gulp.task('default', ['one', 'two']);
// alternativ: gulp.task('default', ['two']);

136voto

massanishi Punkte 2014

Es ist noch keine offizielle Veröffentlichung, aber mit dem kommenden Gulp 4.0 können Sie mit gulp.series ganz einfach synchrone Aufgaben durchführen. Sie können es einfach so machen:

gulp.task('develop', gulp.series('clean', 'coffee'))

Ich habe einen guten Blog-Beitrag gefunden, der zeigt, wie man ein Upgrade durchführt und diese netten Funktionen nutzt: migrating to gulp 4 by example

56voto

Steve Punkte 597

Ich habe eine Node/Gulp-App mit dem generator-gulp-webapp Yeoman Generator erstellt. Es hat das "clean conundrum" auf diese Weise gelöst (Übersetzung der im Frage genannten ursprünglichen Aufgaben):

gulp.task('develop', ['clean'], function () {
  gulp.start('coffee');
});

31voto

thybzi Punkte 1183

run-sequence ist der klarste Weg (zumindest bis Gulp 4.0 veröffentlicht wird)

Mit run-sequence wird deine Aufgabe so aussehen:

var sequence = require('run-sequence');
/* ... */
gulp.task('develop', function (done) {
    sequence('clean', 'coffee', done);
});

Aber wenn du (aus irgendeinem Grund) es lieber nicht verwenden möchtest, gulp.start Methode wird helfen:

gulp.task('develop', ['clean'], function (done) {
    gulp.on('task_stop', function (event) {
        if (event.task === 'coffee') {
            done();
        }
    });
    gulp.start('coffee');
});

Hinweis: Wenn du nur die Aufgabe startest, ohne auf das Ergebnis zu hören, wird die Aufgabe develop eher beendet als coffee, und das kann verwirrend sein.

Du kannst auch das Ereignis-Listener entfernen, wenn es nicht benötigt wird

gulp.task('develop', ['clean'], function (done) {
    function onFinish(event) {
        if (event.task === 'coffee') {
            gulp.removeListener('task_stop', onFinish);
            done();
        }
    }
    gulp.on('task_stop', onFinish);
    gulp.start('coffee');
});

Beachte dass es auch das Ereignis task_err gibt, dem du vielleicht zuhören möchtest. task_stop wird bei erfolgreichem Abschluss ausgelöst, während task_err erscheint, wenn es einen Fehler gibt.

Du fragst dich vielleicht auch, warum es keine offizielle Dokumentation für gulp.start() gibt. Diese Antwort von einem gulp-Mitglied erklärt die Dinge:

gulp.start wird absichtlich nicht dokumentiert, weil es zu komplizierten Build-Dateien führen kann und wir nicht möchten, dass Leute es verwenden

(Quelle: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X