在Rails资产管道(application.js)中排除* .spec.js文件

时间:2016-03-10 11:51:12

标签: ruby-on-rails angularjs sprockets

我试图关注John Papa的AngularJs 1.x样式指南(organising tests)并在客户端代码旁边放置*.spec.js个文件(使用Karma执行)导致some.filter.jssome.filter.spec.js之类的文件彼此相邻。

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

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

有没有更好的方法来实现理想的行为?

(我使用链轮3.5.2和导轨4.2.6)

2 个答案:

答案 0 :(得分:4)

Sprockets本身并没有实现文件通配(但是) - 这只能通过提供自定义DirectiveProcessor来实现。幸运的是,已经有一个宝石提供了你想要的东西: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

答案 1 :(得分:1)

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

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

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为{{1在我的情况下)。

然后,在nil(在任何application.js语句之前)添加:

require_tree