Zadanie Gulp.js, powrót do src?

132

Jestem nowy w łykaniu i przeglądałem przykładowe konfiguracje. Niektórzy ludzie mają następującą strukturę:

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

Inni ludzie to mają:

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

Zastanawiam się jaką różnicę robi powrót na src ??

boldfacedesignuk
źródło

Odpowiedzi:

158

Musisz returnwskazać, że zadanie jest asynchroniczne. gulp.src()zwraca strumień, więc jest asynchroniczny.

Bez tego system zadań nie wiedziałby, kiedy się zakończy. Przeczytaj dokumentację .

Sindre Sorhus
źródło
Świetny! dzięki za odpowiedź Sindre. Niech łyk płynie teraz jak urok. Kocham to.
boldfacedesignuk
Niesamowite dokładnie to, czego szukałem :)
Sebastien Lorber
14
Czy to oznacza, że podczas używania musisz wrócić gulp.src()? Co się stanie, jeśli nie wrócisz gulp.src()?
jbandi
11
Drugie @ jbandi's - oczywiste pytanie, które należy tutaj zadać, brzmi: „Czy jest jakiś powód, aby nie wracać gulp.src(..., czy też powinniśmy to robić zawsze?” Ta odpowiedź byłaby bardziej przydatna, gdyby dotyczyła tego punktu, IMO; obecnie nie wyjaśnia, dlaczego istnieje wiele przykładów zadań, które go wywołują, gulp.src(...ale nie zwracają.
Mark Amery,
2
@jbandi: Jeśli tego nie zrobisz, returnsystem zależności może uruchomić zadanie przed wykonaniem jego zależności. Mam plik gulpfile z wieloma zadaniami (głównie generowanymi przez kod). Ponieważ nie zwracałem strumienia, zadanie zależne już odczytywało plik, podczas gdy jego zależność wciąż się budowała.
Wpadłem
37

Jeśli masz zadania zależne, musisz zwrócić strumień, aby zadania czekały na ukończenie zadań zależnych, zanim zostaną uruchomione.

na przykład

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

w tym przykładzie można się spodziewać Zadania1 do końca (np kompilacji coffeescript lub cokolwiek) przed task2 biegnie ... ale jeśli dodamy do zwrotu - jak na przykładzie poniżej - będą wtedy działać synchronicznie nie asynchronicznie; i skompilowany coffeescript nie będzie minified ponieważ task2 nie będzie czekać do zakończenia zadania 1 i tak nie będzie podnieść na skompilowanej wyjścia Zadania1 . Dlatego zawsze powinniśmy wracać w takich okolicznościach.

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

Edycja: Przepis tutaj wyjaśnia to dalej. https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md

byronyasgur
źródło
26

Uważam, że jest to pomocne, jeśli masz wiele strumieni na zadanie. Musisz połączyć / scalić wiele strumieni i zwrócić je.

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

Alternatywą, przy użyciu struktury definicji zadania Gulps, byłoby:

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
źródło