งาน Gulp.js กลับบน src หรือไม่


132

ฉันเพิ่งเริ่มอึกใหญ่และได้ดูตัวอย่างการตั้งค่า บางคนมีโครงสร้างดังต่อไปนี้:

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

คนอื่นมีสิ่งนี้:

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

ฉันสงสัยว่าผลตอบแทนของ src ทำให้แตกต่างกันอย่างไร??

คำตอบ:


158

คุณreturnระบุว่างานนั้นไม่ตรงกัน gulp.src()ส่งคืนสตรีมดังนั้นจึงเป็นแบบ async

หากไม่มีระบบงานจะไม่ทราบว่าเสร็จสิ้นเมื่อใด อ่านเอกสาร


ยอดเยี่ยม! ขอบคุณสำหรับการตอบกลับ Sindre อึกวิ่งอย่างมีเสน่ห์ตอนนี้ รักมัน.
boldfacedesignuk

สุดยอดสิ่งที่ฉันกำลังมองหา :)
Sebastien Lorber

14
นั่นหมายความว่าคุณต้องคืนเมื่อใช้งานgulp.src()ใช่หรือไม่? จะเกิดอะไรขึ้นถ้าคุณไม่กลับมา gulp.src()?
jbandi

11
I second @ jbandi's - คำถามที่ชัดเจนที่จะถามที่นี่คือ "มีเหตุผลใดบ้างที่จะไม่กลับมาgulp.src(...หรือเราควรทำมันเสมอไป" คำตอบนี้จะมีประโยชน์มากขึ้นหากกล่าวถึงประเด็นนั้น IMO; ในปัจจุบันไม่ได้กล่าวถึงสาเหตุที่มีตัวอย่างงานมากมายที่เรียกใช้gulp.src(...แต่ไม่ส่งคืน
Mark Amery

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

ในตัวอย่างนั้นคุณคาดหวังว่าtask1จะเสร็จสมบูรณ์ (เช่นการคอมไพล์ coffeescript หรืออะไรก็ตาม) ก่อนที่task2จะรัน ... แต่ถ้าเราไม่เพิ่มผลตอบแทน - เหมือนตัวอย่างด้านล่าง - จากนั้นพวกมันจะทำงานแบบซิงโครนัสไม่ใช่แบบอะซิงโครนัส และ CoffeeScript รวบรวมจะไม่ถูกลดขนาดลงเพราะtask2จะไม่ได้รอคอยสำหรับงาน 1 ให้เสร็จสมบูรณ์และเพื่อจะได้รับในการส่งออกรวบรวมtask1 ดังนั้นเราควรกลับมาในสถานการณ์เหล่านี้เสมอ

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


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']);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.