Gulp:在编辑胡子时避免中间文件

我在我的回购中有以下目录结构:

src some-project some-file.html some-file.yml other-project foo.html foo.yml bar.html bar.yml stylesheet.css dist some-project some-file.html some-file.yml other-project foo.html foo.yml bar.html bar.yml 

我有一个吞食任务的任务,在/ src文件夹中的html文件添加任何样式表中的样式,并自动将它们内联在html中(这些是电子邮件)。 yml是发送数据时使用的元信息。

现在我想添加小胡子模板到我的HTML。 模板的数据将在yml文件中。 我遇到的问题是,gulp-mustache插件为其模板input和参数中的对象提供了一个数据stream。

 gulp.task('build', () => { gulp.src('src/**/*.html') .pipe(mustache(data)) // I don't have the data! .pipe(inlineCss({ removeStyleTags: false })) .pipe(prefix(BASE_URL, [ { match: "img[src]", attr: "src"} ])) .pipe(gulp.dest('dist')) }); 

我还有另一个可以将YML编译成JSON的任务,但是我试图避免创build临时文件,因为它打破了吞噬虚拟文件stream的整个观点。 此外,它并没有解决我有两个任务和两个pipe道的问题,我不能将一个文件的内容传递给胡子function。 有什么我失踪?

这似乎是一个非常简单的任务,我search了几个小时没有任何进展。 是不是有一种方法可以让每对文件读取文件?

好的,我首先注意到的是,你在Gulp任务中没有返回任何东西,这可以防止Gulp知道你的任务完成的时间。

由于任务本身是asynchronous的,Gulp支持任务返回一个Promise ,当parsing完成时就会发出完成信号,所以你可以使用node-yaml包来做类似的事情:

 const yaml = require('node-yaml') gulp.task('build', () => { return yaml.read('my-data.yml').then(data => new Promise(resolve => { gulp.src('src/**/*.html') .pipe(mustache(data)) // ... .pipe(gulp.dest('dist')) .on('end', resolve) }); ); }); 

或者简单地使用callback :

 gulp.task('build', callback => { return yaml.read('my-data.yml', data => { gulp.src('src/**/*.html') .pipe(mustache(data)) // ... .pipe(gulp.dest('dist')) .on('end', callback) }); });