在ruby中从一个目录中获取所有文件的最好方法是什么?
如何:
Dir["/path/to/directory/*.rb"].each {|file| require file }
如果它是一个相对于执行要求的文件的目录(例如,你想加载lib目录中的所有文件):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
编辑:根据下面的注释,一个更新的版本:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
最好的方法是将目录添加到加载路径,然后require每个文件的基名。这是因为您希望避免意外地两次需要相同的文件——这通常不是预期的行为。是否加载文件取决于require之前是否看到传递给它的路径。例如,这个简单的irb会话表明,您可能会错误地要求并加载同一个文件两次。
require
$ 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也不知道该文件已经是必需的。
true
在这里,我们将一个目录添加到加载路径中,然后要求每个*的基名。Rb文件。
dir = "/path/to/directory" $LOAD_PATH.unshift(dir) Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
如果你不关心文件是否被多次要求,或者你的目的只是加载文件的内容,也许应该使用load而不是require。在本例中使用load,因为它能更好地表达您要完成的任务。例如:
load
Dir["/path/to/directory/*.rb"].each {|file| load 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. exe”。Rb”是相同的文件)。两次要求相同的文件可能会导致错误的警告(例如。"警告:已初始化的常量")。
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file| require file end
这将在您的本地机器和不使用相对路径的远程(如Heroku)上递归地工作。
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
或者,如果你想要将文件加载到特定的文件夹:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
解释:
Dir.glob以块作为参数。
方法:要求将返回require方法。
method(:require)将方法转换为分组。
我使用File.expand_path,而不是像某些答案中那样连接路径:
File.expand_path
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file| require file end
更新:
你可以不使用File.dirname,而是这样做:
File.dirname
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file| require file end
其中..删除了__FILE__的文件名。
..
__FILE__
我已经晚了几年,但我有点喜欢这个单行解决方案,我用来让rails包括app/workers/concerns中的所有内容:
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
在Rails中,你可以做:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:修正了@Jiggneshh Gohel删除斜杠的建议。
那么:require_relative *Dir['relative path']呢?
require_relative *Dir['relative path']