Подтвердить что ты не робот

Самый чистый/однострочный способ потребовать все файлы в каталоге в Ruby?

При создании драгоценных камней у меня часто бывает такая структура каталогов:

|--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]}" }

Но это две линии и уродливые. Какие хитрости вы сделали, чтобы сделать это одним лайнером?

4b9b3361

Ответ 1

project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}

Или играть в гольф немного больше:

Dir.glob(project_root + '/helpers/*', &method(:require))

Ответ 2

Мне нравится 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]

Ответ 3

Привет, самый чистый способ, который я обнаружил, - использовать Dir.glob с wild cards.

Добавьте в свой файл rake следующее:

gem.files = Dir.glob('lib/**/ *.rb')

Это должно сработать.

Ответ 4

# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)