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

Exclude *.spec.js files in Rails asset pipeline (application.js)

我正在尝试遵循 John Papa 的 AngularJs 1.x 风格指南 (organising tests) 并将 *.spec.js 文件(将使用 Karma 执行)放在客户端代码旁边,这会导致 some.filter.jssome.filter.spec.js 等文件并排放置。

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

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

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

(我使用链轮 3.5.2 和 rails 4.2.6)

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

请注意:此答案基于 ,因为它为我指明了正确的方向,但事实证明有点严酷。

将以下内容放入 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.assetsnil 在我的例子中)。

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

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