2014-09-29 19 views
5

Tôi đang sử dụng Gulp để thu thập tiền chất (thông qua plugin gulp-front-matter) và sau đó, sau khi tổng hợp nó, tôi sẽ lưu nó vào một tệp khác. Trong số các dữ liệu khác, tôi đang lưu một nhóm CSS. Dưới đây là những gì tôi có cho nhiệm vụ compileCSS của mình:Làm cách nào để bạn chạy tác vụ "kết thúc" trên gulp nhưng chỉ ở cuối tác vụ hiện tại?

var collected = []; 

gulp.src('./client/**/*.html') 
    .pipe(frontMatter({ property: 'meta', remove: true })) 
    .pipe(through.obj(function(file, enc, callback) { 
     var css = file.meta; 
     collected.push(css); 
    })) 
    .pipe(gulp.dest('./build/templates')) 
    .on('end', function() { 
     var cssPath = ['build', 'assets', 'css', 'compiled.css']; 
     fs.writeFileSync(cssPath.join(path.sep), cssPath); 
    }) 

;

Tác vụ hoạt động như mong đợi (lưu ý, đây là phiên bản được đơn giản hóa). Mọi thứ hoạt động như mong đợi và tôi nhận được tệp compiled.css với tất cả CSS phía trước. Tuy nhiên, tôi tìm thấy một nhu cầu sử dụng Prefixer không chỉ trên tập tin css thường xuyên của tôi nhưng trên biên dịch mới này. Vì vậy, tôi đã tạo ra một nhiệm vụ prefix:

gulp.task('prefix', ['compileCSS', 'copy'], function() { 
    gulp.src('./build/assets/css/*.css') 
     .pipe(autoprefixer({ browsers: ['last 3 versions'] })) 
     .pipe(gulp.dest('build')) 
    ; 
}); 

Bây giờ, vấn đề là các on('end' chức năng chạy ở phần cuối của TẤT CẢ các nhiệm vụ, không chỉ là nhiệm vụ compileCSS.

Câu hỏi của tôi là, có cách nào để chèn tác vụ loại "khi kết thúc" cho mỗi tác vụ không? Hay có cách nào để sử dụng các luồng bằng cách nào đó (vì nhiệm vụ cuối cùng không phải là luồng thực sự và không tận dụng lợi thế của nó, tôi không thấy cách).

+0

Có phải không chỉ là chúng đang chạy đồng thời vì bạn chưa cung cấp gọi lại? https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md – RichieAHB

Trả lời

9

Đó không phải là trình tự đó là vấn đề, tôi đã không trả lại dòng đó tạo ra một tình trạng chủng tộc do đó, một khắc phục như thế này làm việc:

return gulp.src('./client/**/*.html') 
      .pipe(dosomething()); 
    \\ all other code 

Tôi đoán vấn đề là Gulp chờ một luồng được thực hiện trước khi thiết lập sự kiện tiếp theo. Nếu không trả lại luồng hoặc lời hứa, Gulp chỉ đơn giản là chạy nhiệm vụ và không đợi nó kết thúc.

+0

nếu Gulp chỉ đơn giản là chạy nhiệm vụ và không chờ đợi để nó kết thúc, làm thế nào tôi có thể nắm bắt được kết thúc thực sự? Tôi cần điều đó bởi vì nếu tôi muốn chạy một "ứng dụng" tiêm sau khi tiêm của nhà cung cấp, tôi cần bắt sự kiện này. – carmelolg

7

Bạn có thể thử run-sequence:

var runSequence = require('run-sequence'); 
gulp.task('mytask', function(cb) { 
    runSequence(
    ['parallel1', 'parallel2'], 
    'seq1', 
    'seq2', 
    cb 
); 
}); 

Nếu bạn muốn một cái gì đó có liên quan đến gulpfile của bạn, bạn nên đưa nó cho câu hỏi của bạn.

+1

nó kết thúc là một vấn đề với thực tế là tôi không bao giờ quay trở lại bất kỳ dòng suối có nghĩa là gulp không bao giờ biết khi nào nhiệm vụ được hoàn thành. – antjanus

+0

@antjanus Bạn nên đăng câu trả lời và đánh dấu nó là đã được chấp nhận. – Florent

+1

Tôi phải đợi ít nhất 2 ngày để chấp nhận câu trả lời của riêng mình vì vậy tôi gần như ở đó! :) – antjanus

Các vấn đề liên quan