Tarefa Gulp.js, retornar em src?

132

Eu sou novo em engolir e tenho procurado exemplos de configurações. Algumas pessoas têm a seguinte estrutura:

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

Outras pessoas têm isso:

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

Gostaria de saber que diferença faz o retorno no src?

boldfacedesignuk
fonte

Respostas:

158

Você returnindica que a tarefa é assíncrona. gulp.src()retorna um fluxo, portanto é assíncrono.

Sem ele, o sistema de tarefas não saberia quando terminar. Leia os documentos .

Sindre Sorhus
fonte
Excelente! obrigado pela resposta Sindre. Tenha gole agora como um encanto. Adoro.
Boldfacedesignuk
Impressionante exatamente o que eu estava procurando :) #
Sebastien Lorber
14
Isso significa que você deve retornar ao usar gulp.src()? O que acontece se você não voltar gulp.src()?
jbandi
11
Eu segundo @ jbandi's - a pergunta óbvia a fazer aqui é "existe alguma razão para não voltar gulp.src(..., ou devemos fazê-lo sempre?" Esta resposta seria mais útil se abordasse esse ponto, IMO; no momento, não aborda por que existem muitos exemplos de tarefas que chamam, gulp.src(...mas não a devolvem.
Mark Amery
2
@ jbandi: Caso contrário return, o sistema de dependências poderá iniciar a tarefa antes que suas dependências sejam concluídas. Eu tenho um arquivo gulpfile com muitas tarefas (principalmente geradas por código). Como eu não estava retornando o fluxo, uma tarefa dependente já estava lendo o arquivo enquanto sua dependência ainda estava em construção.
Colocou-
37

Se você tiver tarefas dependentes, será necessário retornar o fluxo para que as tarefas aguardem a conclusão de suas tarefas dependentes antes de serem executadas.

por exemplo

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

nesse exemplo que você esperaria task1 a completa (por exemplo, a compilação do CoffeeScript ou qualquer outro) antes TASK2 executado ... mas, a menos que adicionar retorno - como no exemplo abaixo - em seguida, eles serão executados de forma síncrona não de forma assíncrona; e o coffeescript compilado não será minificado porque a tarefa2 não terá esperado pela conclusão da tarefa 1 e, portanto, não receberá a saída compilada da tarefa1 . Portanto, devemos sempre retornar nessas circunstâncias.

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

Edit: A receita aqui explica mais. https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md

byronyasgur
fonte
26

Achei isso útil, se você tiver vários fluxos por tarefa. Você precisa combinar / mesclar os múltiplos fluxos e devolvê-los.

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

A alternativa, usando a estrutura de definição de tarefa Gulps, seria:

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
fonte