在 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.js
和 some.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.assets
是 nil
在我的例子中)。
然后,在您的 application.js
中(在任何 require_tree
语句之前)添加:
//= stub_glob angular/**/*.spec.js
我正在尝试遵循 John Papa 的 AngularJs 1.x 风格指南 (organising tests) 并将 *.spec.js
文件(将使用 Karma 执行)放在客户端代码旁边,这会导致 some.filter.js
和 some.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.assets
是 nil
在我的例子中)。
然后,在您的 application.js
中(在任何 require_tree
语句之前)添加:
//= stub_glob angular/**/*.spec.js