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 в рельсы