在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:

  1. http://github.com/jarmo/require_all
  2. https://rubygems.org/gems/require_all

它可以让你简单地:

 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']