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 правильно его нашел?


person Joshua Muheim    schedule 04.10.2012    source источник


Ответы (3)


Что касается проблемы перезагрузки разработки, если папка lib является естественным домом для ваших файлов, добавьте ее в путь загрузки Rails примерно так:

module MyEngine
  class Engine < ::Rails::Engine
    config.autoload_paths << File.expand_path("../../lib", __FILE__)
  end
end

Что касается конкретного случая активов поставщика, кажется разумным разместить активы вашего движка в app / assets, где они будут найдены хост-приложением Rails.

person Andy Triggs    schedule 11.07.2013

если вы хотите, чтобы вещи загружались автоматически, поместите их в /app. В противном случае я думаю, что что-либо в /lib должно требоваться вручную. Я вообще считаю, что автозагрузка папки lib - плохая практика.

person Jason Waldrip    schedule 28.05.2014

ваш базовый код для MVC находится в папке приложения. теперь предположим, что у вас есть общий метод / модуль, который часто используется, поэтому для реализации DRYness для вашего кода ... все общие и общие утилиты можно просто поместить в папку lib.

есть прекрасное объяснение когда использовать lib и с использованием папки lib в рельсы

person Milind    schedule 10.06.2014