创建宝石时,我经常有这样的目录结构:
|--lib
|-- helpers.rb
`-- helpers
|-- helper_a.rb
`-- helper_b.rb
在helpers.rb
内,我只是require
- helpers
目录中的文件。但我必须做这样的事情:
$:.push(File.dirname(__FILE__) + '/helpers')
require 'helper_a'
require 'helper_b'
有没有办法制作一行,所以我永远不必添加它?我刚刚想出了这个:
dir = File.join(File.dirname(__FILE__), "helpers")
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" }
但这是两条线而且丑陋。你做了什么光滑的技巧使这个成为一个班轮?
答案 0 :(得分:53)
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}
或者打高尔夫球:
Dir.glob(project_root + '/helpers/*', &method(:require))
答案 1 :(得分:3)
我喜欢require_relative:
Dir.glob('lib/**/*.rb') { |f| require_relative f }
`&方法(:require_relative)技巧不能使用require_relative。我明白了:
`require_relative': cannot infer basepath (LoadError)
但它确实省去了计算project_root
我正在使用ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0]
答案 2 :(得分:0)
我发现最干净的方法是使用Dir.glob和外卡。
将以下内容放入rakefile:
gem.files = Dir.glob('lib/**/ *.rb')
它应该是一种享受。
答案 3 :(得分:0)
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)