2015-02-01 14 views
7

Tôi tự hỏi liệu có cách nào kết hợp hai nhiệm vụ riêng biệt này thành một.Kết hợp nhiều luồng src trong gulp?

Nhiệm vụ concat-js này yêu cầu phải có tệp được tạo trước khi chạy. Nhiệm vụ cache-angular-templates tạo tệp đó. Tệp được tạo cần được bao gồm trong đầu ra concat. Sau khi hoàn tất concat-js, tệp có thể bị xóa — không cần thiết nữa.

Có vẻ như tôi bằng cách nào đó có thể đường ống trong luồng được sử dụng trong cache-angular-tempaltes vào luồng concat-js sử dụng.

gulp.task('concat-js', ['cache-angular-templates'], function() { 
    var concatOutputPath = path.dirname(paths.compiledScriptsFile), 
     concatOutputFileName = path.basename(paths.compiledScriptsFile), 
     jsFiles = [].concat(
      paths.libScripts, 
      paths.appScripts, 
      paths.templateScriptFile, 
      notpath(paths.compiledScriptsFile), 
      notpath(paths.specMockScripts), 
      notpath(paths.specScripts) 
     ); 

    return gulp 
     .src(jsFiles) 
     .pipe(buildTools.concat(concatOutputFileName)) 
     .pipe(gulp.dest(concatOutputPath)) 
     .on('end', function() { 
      del(paths.templateScriptFile); 
     }) 
    ; 
}); 

gulp.task('cache-angular-templates', function() { 
    var cacheOutputPath = path.dirname(paths.templateScriptFile), 
     cacheOutputFileName = path.basename(paths.templateScriptFile); 

    var options = { 
     root: '/' + cacheOutputPath, 
     standalone: true, 
     filename: cacheOutputFileName 
    }; 

    return gulp 
     .src(paths.templates) 
     .pipe(buildTools.angularTemplatecache(options)) 
     .pipe(gulp.dest(cacheOutputPath)) 
    ; 
}); 

Trả lời

14

Thật vậy, bạn nên hợp nhất chúng, vì một trong những ý tưởng của Gulp là loại bỏ các tệp trung gian tạm thời.

Một trong những cách để đạt được điều đó là bởi:

  1. chuyển đổi cache-angular-templates để một hàm trả về dòng khuôn mẫu, chúng ta hãy gọi nó getTemplateStream;
  2. xóa số .pipe(gulp.dest(cacheOutputPath)) khỏi nó;
  3. sử dụng event-stream để hợp nhất các luồng trước khi ghép các luồng đó vào nhiệm vụ chính. Nhiệm vụ chính của bạn sẽ trở thành một cái gì đó như thế này:
var es = require('event-stream'); 

gulp.task('concat-js', function() { 
    var concatOutputPath = path.dirname(paths.compiledScriptsFile), 
     concatOutputFileName = path.basename(paths.compiledScriptsFile), 
     jsFiles = [].concat(
      paths.libScripts, 
      paths.appScripts, 
      notpath(paths.compiledScriptsFile), 
      notpath(paths.specMockScripts), 
      notpath(paths.specScripts) 
     ); 

    return es.merge(gulp.src(jsFiles), getTemplateStream()) 
     .pipe(buildTools.concat(concatOutputFileName)) 
     .pipe(gulp.dest(concatOutputPath)); 
}); 

function getTemplateStream() { 
    var options = { 
     root: '/' + cacheOutputPath, 
     standalone: true, 
     filename: cacheOutputFileName 
    }; 

    return gulp 
     .src(paths.templates) 
     .pipe(buildTools.angularTemplatecache(options)); 
} 

Bằng cách này, bạn đang sáp nhập hai con suối, và các tập tin đầu ra của getTemplateStream của bạn sẽ được gửi xuống các đường ống.

+3

Tuyệt vời! Cảm ơn bạn rất nhiều! Điều này thật đúng với gì mà tôi đã tìm kiếm. Tôi rất vui vì bạn đã không nhận được vào liệu tôi * nên * làm những gì tôi đã làm; Tôi chỉ muốn biết * làm thế nào * để có các mô hình để áp dụng khi tôi cần nó. Cảm ơn một lần nữa! – core

+1

+1 Tôi bình thường không bình luận về các giải pháp có hiệu quả đối với tôi, nhưng tôi đã dành 6 tiếng đồng hồ và đọc tài liệu để tìm ra cách kết hợp nhiều cuộc gọi gulp.src với nhau và đây là điều duy nhất tôi tìm thấy công việc. Câu trả lời nổi bật! –

+0

Tương tự như trên. Thật khó hiểu rằng sự hợp nhất luồng sự kiện và gói hợp nhất làm điều gì đó tinh tế nhưng khác biệt đáng kể. Cảm ơn bạn đã ghi lại! – RobW

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