Rails Engines: Когда вводить код в приложение, когда в lib и когда в папке поставщика?
Я разрабатываю механизм Rails, и поэтому я взглянул на существующие. Я заметил, что многие из них имеют файлы в app
, но также в lib
и vendor
.
Мне ясно, что я должен поместить любой код, который должен быть заменен хост-приложением в папку app
(например, при наличии модели app/user.rb
, хост-приложение может легко иметь свой собственный файл app/user.rb
и используйте этот вариант вместо своего двигателя).
Но я не уверен, когда мне нужно положить материал в lib
, а когда в vendor
? Я думал, что в vendor
я должен поместить только "внешний" код из других разработчиков или проектов, которые я хочу использовать в своем проекте, а в lib
я помещаю свои собственные дополнительные библиотеки, над которыми я фактически работаю в проекте. Но почему, например, WiceGrid помещает материал в каталог wice_grid/vendor/assets? Это не выглядит как внешний код, а код, который разработан только для WiceGrid и, следовательно, должен находиться в каталоге lib
?
Обновление
Во время экспериментов я заметил, что весь код в папке lib
не перезагружается при разработке движка (я думаю, что то же самое имеет место для каталога vendor
), поэтому я должен поместить их в папку в пределах app
, но где точно?
Например, у меня есть файл lib/iq_list_controller.rb
, который содержит некоторые методы класса и экземпляра для ApplicationController
, которые я смешиваю с ним в engine.rb
следующим образом:
initializer "wice_grid_railtie.configure_rails_initialization" do |app|
ActiveSupport.on_load(:action_controller) do
extend IqList::Controller::ClassMethods
include IqList::Controller::InstanceMethods
end
end
Где я должен поместить этот файл так, чтобы Ruby нашел его?
Ответы
Ответ 1
Что касается проблемы перезагрузки разработки, если папка lib является естественным домом для ваших файлов, добавьте ее в путь загрузки Rails с чем-то вроде:
module MyEngine
class Engine < ::Rails::Engine
config.autoload_paths << File.expand_path("../../lib", __FILE__)
end
end
Что касается конкретного случая активов вендора, представляется целесообразным разместить ваши ресурсы движка в приложении/активах, где они будут найдены в приложении Rails хоста.
Ответ 2
если вы хотите, чтобы вещи были автоматически загружены, а затем поместите их в /app
. В противном случае я думаю, что что-либо в /lib
должно быть обязательным вручную. Я вообще считаю, что автозагрузка папки lib - это плохая практика.
Ответ 3
ваш базовый код для MVC входит в папку приложения. Предположим, у вас есть общий метод/модуль, который часто используется, поэтому для реализации DRYness для вашего кода... все общие и общие утилиты можно просто поместить в папку lib.
theres красивое объяснение когда использовать lib и используя папку lib в рельсы