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

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

|--lib
    |-- helpers.rb
    `-- helpers
        |-- helper_a.rb
        `-- helper_b.rb

Внутри helpers.rb, я просто require -ing файлы в каталоге 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]}" }

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

Ответы [ 4 ]

53 голосов
/ 21 марта 2010
project_root = File.dirname(File.absolute_path(__FILE__))
Dir.glob(project_root + '/helpers/*') {|file| require file}

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

Dir.glob(project_root + '/helpers/*', &method(:require))
3 голосов
/ 12 октября 2014

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

0 голосов
/ 08 марта 2017
# helpers.rb
Dir[__dir__ + '/helpers/*'].each &method(:require)
0 голосов
/ 31 декабря 2011

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

Поместите в свой rakefile следующее:

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

Это должно работать удовольствие.

...