是否可以递归地要求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。
- 没有具有belongs_to class_name关系的此类列
- Psych to_yaml选项的文档?
- 从视图ROR渲染表单部分
- 从Geocode经度和纬度获取地址
- 为什么“instance.send(:initialize,* args,** kwargs,&block)”只能从Class#new中失败?
- post#show中的Ruby on Rails NoMethodError
- Rails 3.1和Ruby 1.9.3p125:ruby-debug19仍然崩溃,“未找到符号:_ruby_threadptr_data_type”
- 图像名称未插入到轨道上的ruby中的数据库中
- 没有这样的文件或目录 – git ls-files – WINDOWS