Gulp根据来自先前管道的数据控制输出



我一直在尝试用gulp找到一种方法,仅根据我在管道中收集的yaml数据写出某些文件。我已经能够看到文件的数据,但不能得到我期望的输出。

在这个任务中,我收集了大量的markdown文件,并将它们传递到一个管道中,该管道使用gulp-data读取yaml,然后向其中添加一些其他数据。然后通过Swig将其管道化。

我试图在管道到gulp.dest之前添加某种条件元素。我找到了这个例子,它让我走到现在的位置。

我得到的最接近的是下面:

  .pipe(tap(function(file) {
    if (new Date(file.data.date) >= new Date(buildRange)) {
      console.log(file.path);
      gulp.src(file.path)
        .pipe(gulp.dest(config.paths.dest + '/underreview/'));
    }
  }))

我从console.log命令得到的结果是正确的(它显示了50个文件中的2个)。但是没有东西被写入到目的地。如果我把gulp.dest移出这个管道,所有的文件都会被写入。

我试过使用gulp-if或gulp-ignore,但无法将file.data.date获取到这两个模块中。


编辑:这是完整的任务

module.exports = function(gulp, config, env) {

var gulpSwig = require('gulp-swig'),
    swig = require('swig'),
    data = require('gulp-data'),
    matter = require('gray-matter'),
    runSequence = require('run-sequence'),
    // BrowserSync
    reload = config.browserSync.reload,
    _ = require('lodash'),
    Path = require('path'),
    requireDir = require('require-dir'),
    marked = require('marked'),
    readingTime = require('reading-time'),
    postsData = [],
    postsTags = [],
    pdate = null,
    buildRange = new Date(new Date().setDate(new Date().getDate()-14));
    sitebuilddate = null,
    through = require('through2'),
    gutil = require('gulp-util'),
    rename = require('gulp-rename'),
    File = require('vinyl'),
    $if = require('gulp-if'),
    ignore = require('gulp-ignore'),
    tap = require('gulp-tap');
  var opts = {
    defaults: {
      cache: false
    },
    setup: function(Swig) {
      Swig.setDefaults({
        loader: Swig.loaders.fs(config.paths.source + '/templates')});
    }
  };
  // Full of the compiled HTML file
  function targetPathFull(path, data) {
    return Path.join(Path.dirname(path), targetPath(data));
  }
gulp.task('templates2:under', function() {
    return gulp.src(config.paths.source + '/content/**/*.md')
      .pipe(data(function(file) {
        postData = [];
        var matterObject = matter(String(file.contents)), // extract front matter data
          type = matterObject.data.type, // page type
          body = matterObject.content,
          postData = matterObject.data,
          moreData = requireDir(config.paths.data),
          data = {},
          bodySwig;
        bodySwig = swig.compile(body, opts);
        // Use swig to render partials first
        body = bodySwig(data);
        // Process markdown
        if (Path.extname(file.path) === '.md') {
          body = marked(body);
        }
        // Inherit the correct template based on type
        if (type) {
          var compiled = _.template(
            "{% extends 'pages/${type}.html' %}{% block body %}${body}{% endblock %}"
            // Always use longform until a different template for different types is needed
            //"{% extends 'pages/longform.html' %}{% block body %}${body}{% endblock %}"
          );
          body = compiled({
            "type": type,
            "body": body
          });
        }
        file.path = targetPathFull(file.path, postData);
        moreData.path = targetPath(postData);
        _.merge(data, postData, moreData);
        data.url = data.site.domain + "/" + data.slug;
        // Copy the processed body text back into the file object so Gulp can keep piping
        file.contents = new Buffer(body);
        return data;
      }))
      .pipe(gulpSwig(opts))
      .pipe(tap(function(file) {
        if (new Date(file.data.date) >= new Date(buildRange)) {
          console.log(file.path);
          gulp.src(file.path)
            .pipe(gulp.dest(config.paths.dest + '/underreview/'));
        }
      }))
      .pipe(gulp.dest(config.paths.dest + '/underreview/'));  
  });
}

所以,可能不是最好的解决方案,但经过一些重构后,我想到了这个:

.pipe(gulp.dest(config.paths.dest + '/underreview/'))
      .pipe(tap(function(file) {
        if (new Date(file.data.date) < new Date(buildRange)) {
          console.log(file.data.path);
          del(config.paths.dest + '/underreview/' + file.data.path)
        }
      }))  

我将gulp-tap移到输出之后,然后我删除了刚刚写入的文件。

相关内容

  • 没有找到相关文章

最新更新