如何编写使用其他gulp插件的gulp插件?

时间:2014-08-16 19:27:40

标签: javascript gulp

我有一个gulp任务,用于预编制包含以下内容的把手模板:

gulp.src(['templates/*.hbs'])
    .pipe(handlebars())
    .pipe(declare({
      namespace: 'Template.templates',
      noRedeclare: true
    }))
    .pipe(concat('compiled.js'))
    .pipe(header('Template = {};\nTemplate.render = function(templateName, context) { return Handlebars.template(Template.templates[templateName])(context) };\n'))
    .pipe(gulp.dest('templates'));

我想创建一个包装此功能的gulp插件,使其更易于使用,如下所示:

gulp.src(['templates/*.hbs'])
  .pipe(handlebars2())
  .dest('templates')

或选项:

gulp.src(['templates/*.hbs'])
  .pipe(handlebars2({
    filename: 'compiled.js',
    namespace: 'Template'
  }))
  .dest('templates')

编写gulp插件的文档和我看过的示例源代码只显示了stream的用法,我不知道如何应用它来利用我自己的其他gulp插件。

如何编写gulp插件来完成上述handlebars2的功能?

即使有人指出我正确的方向,我也可以解决它,并将解决方案作为其他人的答案。谢谢!

2 个答案:

答案 0 :(得分:1)

gulp插件的作用是返回一个流,它将使用另一个流中的数据:

lazypipe

当您尝试制作gulp插件时,您无法直接访问正在阅读的流。您只能访问它传递给您的数据(例如,乙烯基文件)。

这样你就无法以传统方式管道。您要做的是重用部分管道。

要轻松实现此类目标,请尝试使用var lazypipe = require(''); var handlebars2 = lazypipe() .pipe(handlebars) .pipe(declare,{ namespace: 'Template.templates', noRedeclare: true }) .pipe(concat,'compiled.js') .pipe(header,'Template = {};\nTemplate.render = function(templateName, context) { return Handlebars.template(Template.templates[templateName])(context) };\n');

    sed -e '1,244d' /home/user/Documents/working_files/storage/file.txt <> /home/user/Documents/working_files/storage/file.txt

请记住,不要在此处调用流创建功能,lazypipe会为您调用它们。

希望我能帮到你。

答案 1 :(得分:1)

由于gulp插件只是处理流,因此您可以使用stream-combiner

var combine = require('stream-combiner');

function coffeePipe() {
    return combine(
        coffeescript(),
        coffeelint.reporter('fail').on('error', function(){
            gutil.beep();
            gulp.run('lint');
        });
};

//usage:
gulp.src().pipe(coffeePipe());

https://github.com/OverZealous/lazypipe/issues/4#issuecomment-36785601

我发现了lazypipe的作者发表的评论:

  

老实说,当我创建lazypipe时,我希望我刚刚想到了后一种解决方案。它真的是一样的,只是稍微冗长一点,并解决了同样的问题。 lazypipe非常受欢迎,所以我很高兴它被使用了!