我试图遵循John Papa的AngularJs 1.x风格指南(组织测试)并将*.spec.js
文件(使用Karma执行)放在客户端代码旁边,这导致some.filter.js
和some.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