gulp.js - 如何将多个流返回主流?

时间:2014-07-11 19:02:13

标签: node.js stream gulp

我想启动一个gulp.src流,将其传递给一个创建一堆新流的函数,然后将其结果传递给gulp.dest。下面是我到目前为止,但显然没有工作,因为我正在将流回流到gulp.dest,因为它期待一个文件,而不是流。所以我的问题是:如何正确地将n个数量的流返回到gulp的原始流中,以便它们能够在管道中正确地继续下去?

//gulpfile.js
var gulp = require('gulp'),
  bundle = require('./lib/bundle.js');

gulp.task('bundle', function() {
  return gulp.src('./bundle.config.js')
    .pipe(bundle())
    .pipe(gulp.dest('./public'));
});

-

//bundle.config.js
module.exports = {
  bundle: {
    main: {
      js: [
        './content/js/foo.js',
        './content/js/baz.js'
      ],
      css: [
        './content/**/*.css'
      ],
      resources: './content/**/*.{png,svg}'
    },
    other: {
      js: './content/js/other.js',
      css: '',
      resources: ''
    }
  }
};

-

//bundle.js
var gulp = require('gulp'),
  through = require('through2'),
  concat = require('gulp-concat');

module.exports = function () {
  return through.obj(function (file, enc, cb) {
    var config;
    try {
      config = require(file.path); // get config file
    } catch (e) {
      this.emit('error', e);
      return cb();
    }
    var streams = [];
    for (var key in config.bundle) {
      var bundle = config.bundle[key];

      streams.push(
        gulp.src(bundle.js, {base: '.'})
          .pipe(concat(key + '.js'))
      );

      streams.push(
        gulp.src(bundle.css, {base: '.'})
          .pipe(concat(key + '.css'))
      );

      streams.push(
        gulp.src(bundle.resources, {base: '.'})
        //.pipe(something())
      );

    }
    for (var i = 0; i < streams.length; i++) {
      // This causes an error in `gulp.dest` because we're returning the stream, not the file.
      // Instead, how do I resolve each of the individual streams and push the results back to the main stream??
      this.push(streams[i]);
    }
    cb();
  });
};

你可以看到这个代码,你可以在这个仓库中分叉和玩:https://github.com/chmontgomery/gulp-streams-to-stream

2 个答案:

答案 0 :(得分:10)

您可以使用merge-stream

连接流
var gulp = require('gulp');
var merge = require('merge-stream');

gulp.task('bundle', function () {

  var paths = [
    { src: 'src/admin/**', dest: './build/admin' },
    { src: 'src/public/**', dest: './build' }
  ];

  var tasks = paths.map(function (path) {
    return gulp.src(path.src).pipe(gulp.dest(path.dest));
  }

  return merge(tasks);
};

答案 1 :(得分:4)

等待你的gulp.dest,直到你合并了流。

var gulp = require('gulp');
var es = require('event-stream');
var concat = require('gulp-concat');

gulp.task('bundle', function(cb) {
      //Sorry, forgot the bundling
      var paths = [{
        path: 'src/admin/**',
        filename: 'one.file'
      }, {
        path: 'src/public/**',
        filename: 'two.file'
      }];

      var tasks = paths.map(function(path) {
          return gulp.src(path.path)
          .pipe(concat(path.filename));
        }

        es.merge.apply(null, tasks)
        .pipe(gulp.dest('./dist/dest'))
        .on('end', cb);
      });