【发布时间】:2015-02-10 01:42:56
【问题描述】:
从流/gulp/vinyl 开始,并尝试使用stream-combiner2 清理/干燥我的 gulpfile。到目前为止它运行良好,除了现在我需要在另一个管道中运行一个子管道(简化的伪代码):
var logger = require("gulp-logger"),
HTMLPrettify = require("gulp-html-prettify"),
combiner = require("stream-combiner2"),
through = require("through2"),
tap = require("gulp-tap"),
_ = require("lodash");
preprocessPipeline = function() {
return combiner.obj(getFrontMatter(), processTemplates());
};
gulp.task("build", ["clean"], function() {
return gulp.src("in/**/*.html")
.pipe(preprocessPipeline())
.pipe(tap(function(file) {
var data, dataSources;
dataSources = getDataSources(file);
data = {};
/* PAUSE MAIN PIPELINE HERE */
/* RUN THIS SUB PIPELINE BELOW */
gulp.src(dataSources)
.pipe(preprocessPipeline())
.pipe(tap(function(file) {
_.merge(data, file.data);
}));
file.data = data;
/* RESUME MAIN PIPELINE */
}))
.pipe(HTMLPrettify())
.pipe(gulp.dest("out"));
});
如您所见,在主“构建”管道中,我尝试对主管道中的每个乙烯基文件对象执行以下操作:
- 暂停执行主“构建”管道
- 通过同步
getDataSources()函数获取当前黑胶唱片的数据源路径 - 使用另一个子管道来处理这些数据源路径,重用
preProccessPipeline并最终合并它们的数据 - 最后将来自数据源的合并数据添加到主管道中的乙烯基文件中,并在主管道中继续执行
gulp.src() 看起来像是将这些数据源文件加载到子管道中的完美方式,但主管道似乎在子管道启动之前完成。
另外,我开始意识到,也许我的管道看起来像同步函数流,很可能我错过了 stream/node.js 难题的关键部分。
帮助我重用管道但不使用子管道的相关文档:
- https://github.com/gulpjs/gulp/blob/master/docs/recipes/sharing-streams-with-stream-factories.md
- https://github.com/gulpjs/gulp/blob/master/docs/recipes/make-stream-from-buffer.md
相关问题:
谢谢。
【问题讨论】:
-
请问这个gulp文件的目的是什么?你只是想构建你的源文件吗?如果是这样,那个构建步骤是什么样的?似乎您正在组合来自多个文件的数据,我不确定这是否完全有必要。我一直在大量使用 gulp / grunt 文件,以前从未见过这样的东西;除非我知道主要目标,否则帮不上什么忙
-
@KeenanLidral-Porter gulp 文件用于构建静态网站。正如我试图展示的主要模板文件需要为前端进行预处理,然后评估它们的模板,产生输出。模板文件还依赖于上下文的数据文件(例如包含)。这些数据文件还需要为前端进行预处理并评估模板,并且在处理模板之前不可能知道与模板文件关联的数据文件。因此,我试图为两种文件类型重用预处理子管道,但在同一个主管道中。谢谢
标签: javascript node.js stream gulp