排除 Rails 资产管道(应用程序.js)中的 *.spec.js 文件



我试图遵循John Papa的AngularJs 1.x风格指南(组织测试)并将*.spec.js文件(使用Karma执行)放在客户端代码旁边,这导致some.filter.jssome.filter.spec.js等文件彼此相邻放置。

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

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

有没有更好的方法来实现预期的行为?

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

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

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

将以下内容放入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 nil)。

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

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

最新更新