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.

26voto

senornestor Punkte 3825

Laut den Gulp-Dokumenten:

Laufen Ihre Aufgaben, bevor die Abhängigkeiten abgeschlossen sind? Stellen Sie sicher, dass Ihre Abhängigkeitsaufgaben die async-Ausführungshinweise korrekt verwenden: Nehmen Sie einen Rückruf entgegen oder geben Sie ein Versprechen oder Ereignisstrom zurück.

Um Ihre Aufgabenfolge synchron auszuführen:

  1. Geben Sie den Ereignisstrom (z. B. gulp.src) an gulp.task zurück, um die Aufgabe darüber zu informieren, wann der Strom endet.
  2. Erklären Sie Abhängigkeiten in dem zweiten Argument von gulp.task.

Sehen Sie den überarbeiteten Code:

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

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

gulp.task 'develop',['clean','coffee'], ->
    console.log "Führe etwas anderes aus"

10voto

CPP Punkte 1041

Ich hatte genau dasselbe Problem und die Lösung stellte sich für mich als ziemlich einfach heraus. Ändern Sie im Grunde genommen Ihren Code wie folgt und es sollte funktionieren. HINWEIS: Das return vor gulp.src hat für mich den entscheidenden Unterschied ausgemacht.

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

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

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

9voto

Assaf Moldavsky Punkte 1651

Ich habe alle vorgeschlagenen Lösungen ausprobiert, aber alle scheinen ihre eigenen Probleme zu haben.

Wenn Sie sich tatsächlich den Orchestrator-Quellcode anschauen, insbesondere die .start()-Implementierung, werden Sie sehen, dass es als Callback behandelt wird, wenn der letzte Parameter eine Funktion ist.

Ich habe dieses Snippet für meine eigenen Aufgaben geschrieben:

  gulp.task( 'task1', () => console.log(a) )
  gulp.task( 'task2', () => console.log(a) )
  gulp.task( 'task3', () => console.log(a) )
  gulp.task( 'task4', () => console.log(a) )
  gulp.task( 'task5', () => console.log(a) )

  function runSequential( tasks ) {
    if( !tasks || tasks.length <= 0 ) return;

    const task = tasks[0];
    gulp.start( task, () => {
        console.log( `${task} fertig` );
        runSequential( tasks.slice(1) );
    } );
  }
  gulp.task( "run-all", () => runSequential([ "task1", "task2", "task3", "task4", "task5" ));

4voto

Lucho Suárez Punkte 49

Ich habe eine Weile nach dieser Antwort gesucht. Jetzt habe ich sie in der offiziellen Gulp-Dokumentation gefunden.

Wenn Sie eine Gulp-Aufgabe ausführen möchten, wenn die letzte abgeschlossen ist, müssen Sie einen Stream zurückgeben:

gulp.task('wiredep', ['dev-jade'], function () {
    var stream = gulp.src(paths.output + '*.html')
        .pipe($.wiredep())
        .pipe(gulp.dest(paths.output));

    return stream; // führe die nächste Aufgabe aus, wenn diese abgeschlossen ist
});

// Zuerst wird die wiredep-Aufgabe ausgeführt und abgeschlossen
gulp.task('prod-jade', ['wiredep'], function() {
    gulp.src(paths.output + '**/*.html')
        .pipe($.minifyHtml())
        .pipe(gulp.dest(paths.output));
});

4voto

Anshad Vattapoyil Punkte 22935

Für mich lief die Minify-Aufgabe nach der Verkettung nicht, da sie eine verkettete Eingabe erwartet und manchmal nicht generiert wurde.

Ich habe versucht, sie einer Standardaufgabe in der Ausführungsreihenfolge hinzuzufügen, und es hat nicht funktioniert. Es hat funktioniert, nachdem ich einfach ein return für jede Aufgabe hinzugefügt und die Minifizierung innerhalb von gulp.start() wie folgt erhalten habe.

/**
* JavaScripts zusammenführen
*/
gulp.task('concat-js', function(){
    return gulp.src([
        'js/jquery.js',
        'js/jquery-ui.js',
        'js/bootstrap.js',
        'js/jquery.onepage-scroll.js',
        'js/script.js'])
    .pipe(maps.init())
    .pipe(concat('ux.js'))
    .pipe(maps.write('./'))
    .pipe(gulp.dest('dist/js'));
});

/**
* JavaScript minimieren
*/
gulp.task('minify-js', function(){
    return gulp.src('dist/js/ux.js')
    .pipe(uglify())
    .pipe(rename('ux.min.js'))
    .pipe(gulp.dest('dist/js'));
});

gulp.task('concat', ['concat-js'], function(){
   gulp.start('minify-js');
});

gulp.task('default',['concat']); 

Quelle http://schickling.me/synchronous-tasks-gulp/

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