Ответ 1
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}
Или играть в гольф немного больше:
Dir.glob(project_root + '/helpers/*', &method(:require))
При создании драгоценных камней у меня часто бывает такая структура каталогов:
|--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]}" }
Но это две линии и уродливые. Какие хитрости вы сделали, чтобы сделать это одним лайнером?
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}
Или играть в гольф немного больше:
Dir.glob(project_root + '/helpers/*', &method(:require))
Мне нравится require_relative:
Dir.glob('lib/**/*.rb') { |f| require_relative f }
Тройка `& method (: 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]
Привет, самый чистый способ, который я обнаружил, - использовать Dir.glob с wild cards.
Добавьте в свой файл rake следующее:
gem.files = Dir.glob('lib/**/ *.rb')
Это должно сработать.
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)