早午餐插件pipline问题

时间:2015-06-06 08:53:58

标签: brunch

我正在为Brunch编写一个插件来过滤'代码库中的文件。基本思路是:

  1. 检查我的源文件(在src\文件夹中,或者任何与库模式不匹配的监视文件夹),
  2. 从代码库(位于lib\文件夹中,src\之外,磁盘上某处)构建导入/必需模块的列表
  3. 根据此列表检查文件并批准'或者'拒绝'它们
  4. 只编译已经批准的内容,所以我不会得到包含我库中所有模块/组件的大文件,但只有我在特定项目中使用的文件< / LI>

    当我只使用JavaScript文件this.pattern = /.*(js|jsx)$/;时,一切正常。下一步是包含更多文件,因为库中的许多模块/组件都有某种模板或样式表,例如,这是一个AngularJS模块:

    lib\
      modules\
        pager\
          controller.jsx
          directive.jsx
          template.html
          pager.styl
          README.md
    

    但是当我扩展模式以包含其他文件this.pattern = /.*/;时,我遇到了各种各样的问题(;大多数都与pipline有关 - 这些都是我遇到的错误。例如:

    • jshint-brunch不喜欢README.md
    • html-brunch不会包装template.html
    • 手写笔 - 早午餐和萨姆早午餐也不开心

    我已尝试单独解决这些问题,例如,如果我禁用html-brunch config.plugins.off: ['html-brunch'],并在编译器函数中添加此代码,它就有用了:

      if( params.path.match(/.html$/) ) {
        params.data = "module.exports = function() { return " + JSON.stringify(params.data) + ";};";
        return callback(null, this.config.modules.wrapper(params.path, params.data));
      } 
    

    ..但我无法解决所有问题。几乎所有问题都与编译器函数中的这一行有关:return callback(null, null);。当我拒绝&#39;一个文件下一个插件得到一些未定义的东西并打破......

    有任何想法如何解决这个问题?

    我希望最终扩展插件的功能以处理静态资产,例如,如果使用了库,请复制lib\images\placeholder-1.jpg(但不是placeholder-2.jpg)在html文件中,但我已经陷入了这一点......

    这是插件的代码:

    var CodeLibrary;
    
    module.exports = CodeLibrary = (function() {
      var required = [];
      CodeLibrary.prototype.brunchPlugin = true;
    
      function CodeLibrary(config) {
        this.config  = config;
        this.pattern = /.*/;
        this.watched = this.config.paths.watched.filter(function(path) {
          return !path.match( config.plugins.library.pattern );
        });
      }
    
      function is_required(path) {
        var name = this.config.modules.nameCleaner(path);
        return required.some(function(e, i, a) { return name.match(e); });
      }
      function in_library(path) {
        return Boolean(path.match( this.config.plugins.library.pattern ));
      }
      function is_watched(path) {
        return this.watched.some(function(e, i, a) { return path.match( e ); });
      }
    
      CodeLibrary.prototype.lint = function(data, path, callback) {
        if( !is_watched.apply(this, [path]) && 
            !is_required.apply(this, [path]) ) 
          return callback();
    
        var es6_pattern = /import .*'(.*)'/gm;
        var commonjs_pattern = /require\('(.*)'\)/gm;   
    
        var match = es6_pattern.exec(data) || commonjs_pattern.exec(data);
    
        while( match != null ) {
          if( required.indexOf(match[1]) === -1 ) 
            required.push( match[1] );
          match = es6_pattern.exec(data) || commonjs_pattern.exec(data);
        }
        callback();
      }
      CodeLibrary.prototype.compile = function(params, callback) {
        if( is_required.apply(this, [params.path]) || 
           !in_library.apply(this, [params.path]) )
          return callback(null, params);
    
        return callback(null, null);
      };
    
      return CodeLibrary;
    
    })();
    

0 个答案:

没有答案