Каков наилучший способ загрузки классов Ruby в приложение? - PullRequest
11 голосов
/ 23 января 2009

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 23 января 2009

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

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

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

require 'observation_worker'
require 'logger_worker'

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

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

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

2 голосов
/ 23 января 2009

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

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

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

  require 'autocode'

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

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

Также вы можете проверить, как сапоги рельсов.

2 голосов
/ 23 января 2009

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

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

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

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

1 голос
/ 07 февраля 2011

оформить заказ на загрузчик этого класса

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
1 голос
/ 23 января 2009

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


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

autoload :Module, "module"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...