2010-03-21 21 views
20

當創建的寶石,我經常有這樣的目錄結構:最簡潔/一種方式要求Ruby中的目錄中的所有文件?

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

但它是兩條線和醜陋。你做了什麼樣的花招讓它成爲一個班輪?

+1

重複的http://stackoverflow.com/questions/735073/best-使用Dir [「/ path/to/directory/*。rb」]。每個{| file | from-a-directory-in-ruby - 需要文件}' – 2010-03-21 19:13:04

+0

更好,使用該問題中提到的require_all gem。 – clacke 2011-06-09 08:36:51

回答

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

或者高爾夫多一點:

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

是的,這是生病的。謝啦。 – 2010-03-21 19:15:37

+0

我不會想到方法#to_proc,很好! – severin 2010-03-22 16:18:17

+0

我會需要了解通配符......但+1和謝謝你救了我的時間......:D – Stefan 2010-12-09 11:49:25

0

您好我發現最乾淨的方法是使用Dir.glob用通配符。

把你的Rakefile如下:

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

它應該治療。

+2

這並沒有回答有關使用require的問題。 – phatmann 2012-08-01 13:49:24

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]

+0

相關:https://bugs.ruby-lang.org/issues/4487 – quinn 2015-12-15 01:27:16

0
# helpers.rb 
Dir[__dir__ + '/helpers/*'].each &method(:require) 
相關問題