2015-02-01 9 views
7

Zastanawiam się, czy istnieje sposób na połączenie tych dwóch osobnych zadań w jedno.Łączenie wielu strumieni src w łyku?

To zadanie wymaga wygenerowania pliku przed uruchomieniem. Zadanie cache-angular-templates generuje ten plik. Wygenerowany plik należy dołączyć do wyjścia concat. Po wykonaniu concat-js plik można usunąć —, nie jest już potrzebny.

Wygląda na to, że powinienem w jakiś sposób móc potokować w strumieniu używanym w cache-angular-tempaltes do wykorzystania w strumieniu concat-js.

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

Odpowiedz

14

Rzeczywiście należy je scalić, ponieważ jednym z pomysłów Gulpa jest wyeliminowanie plików tymczasowych.

Jednym ze sposobów, aby to osiągnąć jest przez:

  1. konwersji cache-angular-templates do funkcji, która zwraca strumień szablonów, nazwijmy to getTemplateStream;
  2. usunięcie z niego .pipe(gulp.dest(cacheOutputPath));
  3. przy użyciu event-stream, aby scalić strumienie przed połączeniem go z głównym zadaniem. Twoim głównym zadaniem stanie się coś takiego:
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)); 
} 

Dzięki temu masz połączenia dwóch strumieni, a plik wyjściowy Twój zostaną wysłane w dół rurę getTemplateStream.

+3

Awesome! Dziękuję bardzo! Właśnie tego szukałem. Cieszę się, że nie zrozumiałeś, czy * powinienem * robić to, co robię; Chciałem tylko wiedzieć, * jak * zastosować wzór, kiedy go potrzebuję. Dzięki jeszcze raz! – core

+1

+1 Zazwyczaj nie komentuję rozwiązań, które działają dla mnie, ale spędziłem ostatnie sześć godzin na wyszukiwaniu w Google i czytaniu dokumentów, aby dowiedzieć się, jak połączyć wiele połączeń gulp.src i jest to jedyna rzecz, jaką udało mi się znaleźć. praca. Znakomita odpowiedź! –

+0

To samo, co powyżej. To mylące, że strumień zdarzeń łączy się, a pakiet scalający wykonuje coś subtelnie, ale znacznie inaczej. Dzięki za dokumentację! – RobW