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.