Gulp.js Aufgabe, zurück auf src?

132

Ich bin neu im Schlucken und habe mir Beispiel-Setups angesehen. Einige Leute haben die folgende Struktur:

gulp.task("XXXX", function() {
    gulp.src("....

Andere Leute haben dies:

gulp.task("XXXX", function() {
   return gulp.src("....

Ich frage mich, welchen Unterschied die Rendite auf dem src macht?

Fettdruckdesignuk
quelle

Antworten:

158

Sie geben returnan, dass die Aufgabe asynchron ist. gulp.src()Gibt einen Stream zurück, ist also asynchron.

Ohne sie würde das Task-System nicht wissen, wann es fertig ist. Lesen Sie die Dokumente .

Sindre Sorhus
quelle
Ausgezeichnet! Danke für die Antwort Sindre. Lass den Schluck jetzt wie ein Zauber laufen. Liebe es.
boldfacedesignuk
Genial genau das, wonach ich gesucht habe :)
Sebastien Lorber
14
Bedeutet das, dass Sie bei der Verwendung zurückkehren müssengulp.src() ? Was passiert, wenn Sie nicht zurückkehren gulp.src()?
Jbandi
11
Ich stimme @ jbandi zu - die offensichtliche Frage, die hier gestellt werden muss, lautet: "Gibt es jemals einen Grund, nicht zurückzukehren gulp.src(..., oder sollten wir es immer tun?" Diese Antwort wäre nützlicher, wenn sie diesen Punkt ansprechen würde, IMO; Derzeit wird nicht angesprochen, warum es viele Beispiele für Aufgaben gibt, die aufgerufen, gulp.src(...aber nicht zurückgegeben werden.
Mark Amery
2
@jbandi: Wenn Sie dies nicht tun, returnstartet das Abhängigkeitssystem möglicherweise eine Aufgabe, bevor ihre Abhängigkeiten erledigt sind. Ich habe eine Gulpfile mit vielen Aufgaben (meistens Code-generiert). Da ich den Stream nicht zurückgegeben habe, hat eine abhängige Aufgabe die Datei bereits gelesen, während sich ihre Abhängigkeit noch aufbaute.
Habe
37

Wenn Sie abhängige Aufgaben müssen Sie zurückkehren , den Strom für die Aufgaben vollständig auf ihren abhängigen Aufgaben zu warten , bevor sie selbst ausgeführt wird .

z.B

// without return
gulp.task('task1', function() {
    gulp.src('src/coffee/*.coffee')
      /* eg compile coffeescript here */
     .pipe(gulp.dest('src'));
});

gulp.task('task2', ['task1'], function() {
    gulp.src('src/*.js')
      /* eg minfify js here */
     .pipe(gulp.dest('dest'));
});

In diesem Beispiel würde man erwarten , dass Task1 abgeschlossen ist (z. B. das Kompilieren des Kaffeeskripts oder was auch immer), bevor Task2 ausgeführt wird. Wenn wir jedoch keine Rückgabe hinzufügen - wie im folgenden Beispiel -, werden sie synchron und nicht asynchron ausgeführt. und das kompilierte Kaffeeskript wird nicht minimiert, da Task2 nicht auf den Abschluss von Task 1 gewartet hat und daher die kompilierte Ausgabe von Task1 nicht aufnimmt . Deshalb sollten wir unter diesen Umständen immer zurückkehren.

// with return
gulp.task('task1', function() {
    return gulp.src('**/*.coffee')
      /* your operations here */
     .pipe(gulp.dest('dest'));
});

gulp.task('task2', ['task1'], function() {
    return gulp.src('**/*.js')
      /* your operations here */
     .pipe(gulp.dest('dest'));
});

Bearbeiten: Das Rezept hier erklärt es weiter. https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md

byronyasgur
quelle
26

Ich fand das hilfreich, wenn Sie mehrere Streams pro Aufgabe haben. Sie müssen die mehreren Streams kombinieren / zusammenführen und zurückgeben.

var gulp = require('gulp');
var merge = require('gulp-merge');

gulp.task('test', function() {
    var bootstrap = gulp.src('bootstrap/js/*.js')
        .pipe(gulp.dest('public/bootstrap'));

    var jquery = gulp.src('jquery.cookie/jquery.cookie.js')
        .pipe(gulp.dest('public/jquery'));

    return merge(bootstrap, jquery);
});

Die Alternative unter Verwendung der Gulps-Aufgabendefinitionsstruktur wäre:

var gulp = require('gulp');

gulp.task('bootstrap', function() {
    return gulp.src('bootstrap/js/*.js')
        .pipe(gulp.dest('public/bootstrap'));
});

gulp.task('jquery', function() {
    return gulp.src('jquery.cookie/jquery.cookie.js')
        .pipe(gulp.dest('public/jquery'));
});

gulp.task('test', ['bootstrap', 'jquery']);
jpblancoder
quelle