如何在Gulp流中将YAML导入EJS?

时间:2015-01-22 19:12:18

标签: stream yaml gulp ejs

我正在使用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将与解决方案有关...

2 个答案:

答案 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-yamlgulp-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' ));

        }));
});

希望这可能有助于其他人坚持这一点。如果有人有更好的解决方案,请随时发表评论。