在ruby中需要从目录中获取所有文件的最佳方法是什么?
在ruby目录下需要所有文件的最佳方法是什么?
怎么样:
Dir["/path/to/directory/*.rb"].each {|file| require file }
如果它是一个相对于需要的文件的目录(例如,你想加载lib目录中的所有文件):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
试试require_all gem:
它可以让你简单地:
require_all 'path/to/directory'
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file| require File.basename(file, File.extname(file)) end
如果你不删除扩展名,那么你最终可能需要两次相同的文件(ruby不会意识到“foo”和“foo.rb”是同一个文件)。 需要两次相同的文件可能会导致虚假的警告(例如“警告:已经初始化常量”)。
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
或者,如果要将文件范围加载到特定文件夹,请执行以下操作:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
说明:
Dir.glob以块为参数。
方法(:require) 将返回require方法。
&方法(:require)将方法转换为一个方块。
最好的方法是将目录添加到加载path,然后require
每个文件的基本名称。 这是因为你想避免意外地要求两次相同的文件 – 往往不是预期的行为。 一个文件是否被加载取决于require
是否已经看到之前传递给它的path。 例如,这个简单的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
意味着同一文件被加载两次。 使用path时,即使path指向相同的位置, require
也不知道文件已经是必需的。
在这里,我们将一个目录添加到加载path,然后需要每个* .rb文件的基本名称。
dir = "/path/to/directory" $LOAD_PATH.unshift(dir) Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
如果你不关心需要的文件不止一次,或者你的意图只是加载文件的内容,也许应该使用load
而不是require
。 在这种情况下使用负载,因为它更好地expression你正在尝试完成。 例如:
Dir["/path/to/directory/*.rb"].each {|file| load file }
我使用File.expand_path
代替在一些答案中连接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
Where ..
__FILE__
的文件名。
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file| require file end
这将在您的本地机器和远程(如Heroku)上recursion地工作,而不使用相对path。
在Rails中,你可以这样做:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:更正@Jiggneshh Gohel的build议,删除斜杠。
我晚了几年,但我有点像这个单线解决scheme,我曾经得到轨道包括应用程序/工人/关注的一切:
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
那么: require_relative *Dir['relative path']
?