要求ruby目录中的所有文件的最佳方法是什么?
答案 0 :(得分:435)
怎么样:
Dir["/path/to/directory/*.rb"].each {|file| require file }
答案 1 :(得分:333)
如果它是相对于执行要求的文件的目录(例如,您要加载lib目录中的所有文件):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
修改:根据以下评论,更新版本:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
答案 2 :(得分:97)
尝试require_all gem:
它让你简单地说:
require_all 'path/to/directory'
答案 3 :(得分:52)
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
如果你没有剥离扩展名,那么你最终可能需要两次相同的文件(ruby不会意识到“foo”和“foo.rb”是同一个文件)。要求两次使用同一文件可能会导致虚假警告(例如“警告:已初始化常量”)。
答案 4 :(得分:41)
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
或者,如果要将文件范围加载到特定文件夹:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
解释:
Dir.glob以块为参数。
方法(:要求)will return the require method.
& method(:require)会将方法转换为bloc。
答案 5 :(得分:30)
最好的方法是将目录添加到加载路径,然后require
每个文件的基名。这是因为您希望避免意外地需要两次相同的文件 - 通常不是预期的行为。是否加载文件取决于require
之前是否已经看到传递给它的路径。例如,这个简单的irb会话显示您可能错误地要求并加载相同的文件两次。
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
请注意,前两行返回true
,表示同时加载了同一个文件。使用路径时,即使路径指向同一位置,require
也不知道该文件已被要求。
在此,我们将一个目录添加到加载路径,然后需要每个* .rb文件的基本名称。
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
如果您不关心多次需要该文件,或者您只想加载该文件的内容,则应使用load
代替require
。在这种情况下使用load,因为它更好地表达了您要完成的任务。例如:
Dir["/path/to/directory/*.rb"].each {|file| load file }
答案 6 :(得分:14)
不是像某些答案那样连接路径,而是使用File.expand_path
:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
<强>更新强>
您可以执行以下操作,而不是使用File.dirname
:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
..
删除__FILE__
的文件名。
答案 7 :(得分:13)
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
这将在您的本地计算机和一个不使用相对路径的远程(如Heroku)上递归工作。
答案 8 :(得分:7)
在Rails中,你可以这样做:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:更正了@Jiggneshh Gohel建议删除斜杠。
答案 9 :(得分:3)
我参加派对已经晚了几年,但我有点喜欢这个单行解决方案,我曾经习惯性地将所有内容都包含在app / workers / Concer中:
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
答案 10 :(得分:-2)
那么:\w+
?