我正在使用gulp.js。我想将gulp-yaml中生成的JSON数据直接导入gulp-ejs。我的逻辑说我可能必须在某个时候获得同步?
到目前为止我尝试过:
var yaml = require('gulp-yaml');
var ejs = require('gulp-ejs');
gulp.task('yaml', function(){
return gulp.src('./path/to/template.ejs')
.pipe( ejs( gulp.src('./path/to/data.yml').pipe( yaml() ) ) )
.pipe(gulp.dest('./path/to/dest'));
});
我意识到上面是一个愚蠢的脚本,因为我基本上试图将一个流作为参数传递给ejs
。正如预测的那样,它不起作用。我尝试了很多其他的东西,但我猜之前有人这样做了吗?
我认为gulp-data将与解决方案有关...
答案 0 :(得分:2)
您可能不需要gulp-data插件来实现这一目标;就像你说你只是将选项同步传递给ejs插件,而你只需要一个yaml配置文件。所以这可能更好:
var yaml = require('js-yaml');
var ejs = require('gulp-ejs');
var fs = require('fs');
gulp.task('ejs-with-yaml', function () {
return gulp.src('path/to/template.ejs')
.pipe(ejs(yaml.safeLoad(fs.readFileSync('path/to/data.yml', 'utf-8'))))
.pipe(gulp.dest('path/to/dest'));
});
答案 1 :(得分:0)
好的,所以经过一番头痛之后,我已经能够使用js-yaml和gulp-data找到解决方案。
var yaml = require('js-yaml');
var ejs = require('gulp-ejs');
var data = require('gulp-data');
gulp.task('ejs-with-yaml', function(){
return gulp.src('path/to/data.yml'))
.pipe(data(function(file, cb){
// throughput the stream in case of bad/absent file data
if (file.isNull()) return cb( null, file );
if (file.isStream()) return cb( new Error("Streaming not supported") );
// try and convert yaml to json
try {
json = yaml.load(String(file.contents.toString('utf8')));
} catch(e) {
console.log(e);
}
gulp.src('path/to/template.ejs').pipe(ejs(json)).pipe(gulp.dest( 'path/to/dest' ));
}));
});
希望这可能有助于其他人坚持这一点。如果有人有更好的解决方案,请随时发表评论。