将Ruby类加载到应用程序中的最佳方法是什么?

时间:2009-01-23 00:36:13

标签: ruby

目前,我使用require命令将Ruby类加载到每个类文件中,例如:

require File.join(File.dirname(__FILE__), 'observation_worker')
require File.join(File.dirname(__FILE__), 'log_worker')

对于每个类,我都要定义它所需的类。如果我可以在申请的入口处这样做,那就太好了。

是否有一种简单的方法可以在应用程序启动时加载所有Ruby类?

5 个答案:

答案 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