目前,我使用require命令将Ruby类加载到每个类文件中,例如:
require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')
对于每个类,我都要定义它所需的类。如果我可以在申请的入口处这样做,那就太好了。
是否有一种简单的方法可以在应用程序启动时加载所有Ruby类?
答案 0 :(得分:11)
如果你的代码所在的目录结构有点清晰,你可以在加载路径中添加特定的目录路径,如
$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
然后在您的代码的其他部分,您可能需要相对路径,如下所示:
require 'observation_worker'
require 'logger_worker'
或者如果你在lib中有文件夹,你甚至可以
require 'workers/observation'
require 'workers/logger'
在我看来,这可能是处理库内容中最干净的方法。
答案 1 :(得分:2)
不确定我完全理解,因为你总是要告诉你的程序它需要什么文件,但你可以这样做:
Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) }
其中包含当前文件目录中的所有.rb文件。 虽然如果你开始使用RDoc,它会对你不满意。
明确列出您的要求通常不是一件坏事,它让其他开发人员清楚地了解您的代码发生了什么。
答案 2 :(得分:2)
这是我喜欢使用的选项。
http://github.com/dyoder/autocode/tree/master
来自github doc
require 'autocode'
module Application
include AutoCode
auto_load true, :directories => [ :configurations, :models, :views, :controllers ]
end
这将尝试从给定目录动态加载代码,使用模块名称来确定哪些 要查看的目录。因此,Application :: CustomerModel可以加载文件models / customer_model.rb。
此外,您还可以查看rails boots的启动方式。
答案 3 :(得分:1)
由jtzero评论,autoload已被弃用
您仍然需要指定要加载的内容,但您可以尝试autoload
。
autoload :Module, "module"
首次使用常量Module
时,文件"module"
将自动require
。
答案 4 :(得分:1)
结帐此类加载器
http://github.com/alexeypetrushin/class_loader
假设您有以下目录结构
/your_app
/lib
/animals
/dog.rb
/zoo.rb
只需将ClassLoader指向应用程序的根目录,它就会自动查找并加载所有其他类
require 'class_loader'
autoload_dir '/your_app/lib'
Zoo.add Animals::Dog.new # <= all classes loaded automatically