【问题标题】:Exclude *.spec.js files in Rails asset pipeline (application.js)在 Rails 资产管道 (application.js) 中排除 *.spec.js 文件
【发布时间】:2016-06-25 06:03:30
【问题描述】:

我正在尝试遵循 John Papa 的 AngularJs 1.x 样式指南 (organising tests) 并将 *.spec.js 文件(将使用 Karma 执行)放在客户端代码旁边,这会产生诸如 some.filter.js 和 @ 之类的文件987654324@ 并排放置。

但是,我需要避免的是在资产管道中包含 *.spec.js 文件。

我目前看到的唯一选择是避免在 application.js 文件中使用 //= require_tree . 并明确指定每个文件,或者放弃将规范文件保留在代码旁边。

有没有更好的方法来实现所需的行为?

(我使用的是 sprockets 3.5.2 和 rails 4.2.6)

【问题讨论】:

    标签: ruby-on-rails angularjs sprockets


    【解决方案1】:

    Sprockets 本身(还)没有实现文件通配 - 这只能通过提供自定义 DirectiveProcessor 来实现。幸运的是,已经有一个 gem 提供了你想要的东西:https://github.com/backupify/sprockets-glob

    来自文档:

    # config/initializers/sprockets.rb
    require 'sprockets/glob'
    Rails.application.assets.register_processor('application/javascript', Sprockets::Glob::DirectiveProcessor)
    
    # application.js
    //= require_glob features/**/*.js
    //= stub_glob features/**/*test.js
    

    【讨论】:

      【解决方案2】:

      请注意:这个答案是基于defsprite's one,因为它为我指明了正确的方向,但事实证明有点残酷。

      将以下内容放入config/initializers/sprockets.rb 以注册新的 sprockets 处理器:

      class DirectiveProcessor < Sprockets::DirectiveProcessor
        def process_require_glob_directive(glob)
          each_file(glob) { |fn| process_require_directive(fn) }
        end
      
        def process_stub_glob_directive(glob)
          each_file(glob) { |fn| process_stub_directive(fn) }
        end
      
        private
      
        def each_file(glob)
          glob_pattern = "#{@dirname}/#{glob}"
          path_prefix = Pathname.new(@dirname)
      
          Dir[glob_pattern].sort.each do |path|
            yield Pathname.new(path).relative_path_from(path_prefix).to_s
          end
        end
      end
      
      Rails.application.config.assets.configure do |env|
        env.register_processor('application/javascript', DirectiveProcessor)
      end
      

      相对于原始答案最显着的变化包括将Dir 返回的绝对路径转换为相对路径(链轮不接受绝对路径)和不同的注册方法(Rails.application.assets 在我的例子中是nil) .

      然后,在您的 application.js 中(在任何 require_tree 语句之前)添加:

      //= stub_glob angular/**/*.spec.js
      

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 2017-12-27
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多