在gulp中组合多个src流?

时间:2015-02-01 04:13:38

标签: angularjs gulp gulp-concat

我想知道是否有办法将这两个单独的任务合二为一。

concat-js任务要求在运行之前存在生成的文件。任务cache-angular-templates生成该文件。生成的文件需要包含在concat输出中。 concat-js完成后,文件可以删除 - 不再需要了。

似乎我应该能够以某种方式将cache-angular-tempaltes中使用的流管道传输到流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))
    ;
});

1 个答案:

答案 0 :(得分:14)

确实你应该合并它们,因为Gulp的一个想法是消除中间临时文件。

实现目标的方法之一是:

  1. cache-angular-templates转换为返回模板流的函数,我们称之为getTemplateStream;
  2. 从中移除.pipe(gulp.dest(cacheOutputPath));
  3. 使用event-stream合并流,然后在主任务上连接它。你的主要任务将是这样的:
  4. 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));
    }
    

    通过执行此操作,您将合并两个流,getTemplateStream的输出文件将从管道发送。