是否可以递归地要求Ruby中的目录中的所有文件?

我正在开发一个API,需要加载当前目录和所有子目录中的所有.rb文件。 目前,我正在为我添加的每个文件输入一个新的require语句,但是我想把它放在我只需要将文件放在其中一个子目录中并自动添加的地方。

是否有标准命令来执行此操作?

在这种情况下,它加载lib目录下的所有文件:

Dir["#{File.dirname(__FILE__)}/lib/**/*.rb"].each { |f| load(f) } 
 require "find" Find.find(folder) do |file| next if File.extname(file) != ".rb" puts "loading #{file}" load(file) end 

这将递归加载每个.rb文件。

就像Miguel Fonseca说的那样,但是在ruby> = 2中你可以做到:

  Dir[File.expand_path "lib/**/*.rb"].each{|f| require_relative(f)} 

我一直使用gem require_all ,它可以根据您的要求使用以下模式完成工作:

 require 'require_all' require_all './lib/exceptions/' 
 def rLoad(dir) Dir.entries(dir).each {|f| next if f=='.' or f=='..' if File.directory?(f) rInclude(f) else load(f) if File.fnmatch('*.rb', f) end } end 

这应该递归load dir指定的dir中的所有.rb文件。 例如, rLoad Dir.pwd可以在当前工作目录上工作。

不过要小心这样做。 这会进行深度优先搜索,如果您的Ruby脚本中存在任何冲突的定义,它们可能会以一种非显而易见的方式解析(我相信按字母顺序排列的文件夹/文件名)。

你应该看看这个gem 。 它非常小,所以你可以重新使用代码而不是安装整个gem。