Каков наилучший способ загрузки классов Ruby в приложение?

В настоящее время я загружаю классы Ruby в каждый файл класса с помощью команды require, например:

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

Для каждого класса я определяю классы, которые он требует. Было бы здорово, если бы я мог сделать это в точке входа в мое приложение.

Есть ли простой способ загрузить все классы Ruby в начале приложения?

Ответ 1

Если у вас есть несколько четкая структура каталогов вашего кода, вы можете добавить определенные пути к пути загрузки, например

$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )

то в других частях вашего кода вы можете потребовать от относительного пути следующим образом:

require 'observation_worker'
require 'logger_worker'

или если у вас есть папки внутри lib, вы даже можете сделать

require 'workers/observation'
require 'workers/logger'

Это, пожалуй, самый чистый способ обработки загрузки в контексте библиотеки.

Ответ 2

Не уверен, что я полностью понимаю, так как вам всегда нужно сообщить своей программе, какие файлы ему нужны, но вы можете сделать что-то вроде:

Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) }

который будет содержать все файлы .rb из каталога текущего файла. Хотя, если вы когда-нибудь начнете использовать RDoc, вам это не понравится.

Как правило, это плохо, чтобы вы явно указывали, что вы требуете, это дает понять другим разработчикам, читающим ваш код, что происходит.

Ответ 3

Здесь вариант, который мне нравится использовать.

http://github.com/dyoder/autocode/tree/master

Из документа github

  require 'autocode'

  module Application
    include AutoCode
    auto_load true, :directories => [ :configurations, :models, :views, :controllers ]
  end

Это будет пытаться динамически загружать код из указанных каталогов, используя имя модуля, чтобы определить, какие каталог для поиска. Таким образом, приложение:: CustomerModel может загружать файловые модели /customer _model.rb.

Кроме того, вы можете проверить способ загрузки рельсов.

Ответ 4

Как прокомментировал jtzero, автозагрузка устарела


Вам все равно нужно указать, что загружать, но вы можете попробовать autoload.

autoload :Module, "module"

Когда константа Module используется впервые, файл "module" будет автоматически require d.

Ответ 5

проверить этот загрузчик классов

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