目前我正在使用 require 命令将 Ruby 类加载到每个类文件中,例如:
require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')
对于每个类,我都定义了它所需的类。如果能在我的应用程序入口处完成这些定义就太好了。
有没有一种简单的方法可以在应用程序启动时加载所有Ruby类?
目前我正在使用 require 命令将 Ruby 类加载到每个类文件中,例如:
require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')
对于每个类,我都定义了它所需的类。如果能在我的应用程序入口处完成这些定义就太好了。
有没有一种简单的方法可以在应用程序启动时加载所有Ruby类?
如果你有一个相对清晰的目录结构来存放你的代码,你可以将特定的目录路径添加到加载路径中:
$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
那么在您的代码的其他部分,您可以像这样从相对路径进行要求:
require 'observation_worker'
require 'logger_worker'
或者如果你在 lib 文件夹中有子文件夹,你甚至可以这样做:
require 'workers/observation'
require 'workers/logger'
在我看来,这可能是处理库上下文中加载的最清晰的方法。
我不太确定是否完全理解了,因为您总是需要告诉您的程序需要哪些文件,但您可以这样做:
Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) }
这将包括当前文件目录中所有的.rb文件。虽然,如果您开始使用RDoc,它可能不会很满意。
通常情况下,明确列出您的requires并不是一件坏事,这使得阅读您代码的其他开发人员清楚地知道正在发生什么。
require 'autocode'
module Application
include AutoCode
auto_load true, :directories => [ :configurations, :models, :views, :controllers ]
end
这将尝试从给定的目录动态加载代码,使用模块名称确定要查找的目录。因此,Application::CustomerModel可以加载文件models/customer_model.rb。
另外,您可以查看Rails引导的方式。
看看这个类加载器
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
正如jtzero所评论的那样,autoload已经被弃用了
您仍需要指定要加载的内容,但可以尝试使用autoload
。
autoload :Module, "module"
Module
首次被使用时,文件"module"
将自动require
。