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 ??

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ę .


Ś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


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']);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.