Каков наилучший способ загрузки классов 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