Задача Gulp.js, вернуться на src?

132

Я новичок в gulp и просматривал примеры настроек. У некоторых людей такая структура:

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

У других есть это:

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

Мне интересно, какая разница в возврате src ??

boldfacedesignuk
источник

Ответы:

158

Вы returnдолжны указать, что задача асинхронная. gulp.src()возвращает поток, поэтому он асинхронный.

Без него система задач не узнает, когда она завершится. Прочтите документацию .

Синдре Сорхус
источник
Превосходно! спасибо за ответ Синдре. Теперь сделай глоток как шарм. Любить это.
boldfacedesignuk
Потрясающе именно то, что я искал :)
Себастьян Лорбер
14
Означает ли это, что вы должны вернуться при использовании gulp.src()? Что будет, если вы не вернетесь gulp.src()?
jbandi 05
11
Второй вопрос @jbandi - очевидный вопрос, который следует задать здесь: «Есть ли причина не возвращаться gulp.src(..., или мы должны делать это всегда?» Этот ответ был бы более полезным, если бы он касался этого вопроса, ИМО; в настоящее время он не объясняет, почему существует много примеров задач, которые вызывают, gulp.src(...но не возвращают его.
Марк Эмери
2
@jbandi: Если вы этого не сделаете, returnто система зависимостей может запустить задачу до того, как ее зависимости будут выполнены. У меня есть gulpfile с множеством задач (в основном сгенерированных кодом). Поскольку я не возвращал поток, зависимая задача уже читала файл, пока ее зависимость еще строилась. У меня всякие неприятности ...
gligoran
37

Если у вас есть зависимые задачи, вам необходимо вернуть поток, чтобы задачи ожидали завершения своих зависимых задач, прежде чем запускаться сами.

например

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

в этом примере вы ожидаете, что задача 1 будет завершена (например, компиляция coffeescript или что-то еще) до запуска задачи 2 ... но если мы не добавим return, как в примере ниже, они будут выполняться синхронно, а не асинхронно; и скомпилированный coffeescript не будет минифицирован, потому что задача 2 не будет ждать завершения задачи 1 и поэтому не получит скомпилированный вывод задачи 1 . Поэтому мы всегда должны возвращаться в таких обстоятельствах.

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

Изменить: рецепт здесь объясняет это дальше. https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md

byronyasgur
источник
26

Я нашел это полезным, если у вас есть несколько потоков для каждой задачи. Вам нужно объединить / объединить несколько потоков и вернуть их.

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

Альтернативой, использующей структуру определения задачи Gulps, могло бы быть:

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
источник