我正在开发一个API,需要加载当前目录及其所有子目录中的所有.rb文件。目前,每添加一个文件都要输入一个新的require语句,但我希望只需将文件放在其中一个子目录中,就可以自动添加。
是否有标准命令可以实现这一点?
Dir["#{File.dirname(__FILE__)}/lib/**/*.rb"].each { |f| load(f) }
load
而不是 require
? - johannesrequire
不介意你传入扩展名,所以在我看来这是更可取的。 - johannesrequire
,这个文件会被视为源文件并作为库加载。使用 load
则会将文件作为脚本运行,并防止加载文件中的任何局部变量被导入到当前环境中。Ruby也允许你使用 load
重新导入一个文件,但不能使用 require
。这里可以使用任一语法,只要确保它执行的是你所期望的操作。 - btarequire 'bundler'
时,Ruby会在bundler gem的lib
目录中找到bundler.rb
文件并运行其中的代码。 - Nathanrequire "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,并通过以下方式在您的requires中完成工作:
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
这应该递归地加载
指定目录中的所有.rb文件。例如,rLoad Dir.pwd
将在当前工作目录上运行。
但是要小心执行此操作。这会进行深度优先搜索,如果您的Ruby脚本中存在任何冲突的定义,则可能以某种非明显的方式解决它们(我相信是按文件夹/文件名称的字母顺序)。
f
? - GeoFile.fnmatch('*.rb', f)
,该语句将在文件名 f
匹配模式 *.rb
时返回 true。这确保我们只加载 Ruby 脚本,而不是文件夹中可能存在的其他文件。请注意,如果您还有使用 .rbw 扩展名的脚本,则可能需要添加另一个条件。 - btaload(f) if f =~/\.rb/
。我指的是为什么要使用fnmatch而不是内置的正则表达式支持。 - Geo~/\.rb$/
正则表达式也可以工作(添加了$
以防止匹配像“script.rb.bak”这样的文件)。 - bta
die.rb
?如果该项目已经很老并且已经收集了垃圾,我同意这是危险的。然而,对于一个相对较新的项目来说,这是一个明智的举动,可以防止某人意外地将die.rb
添加到代码库中(它会在加载时失败/错误更早地变得明显)。 - Adamantish