У меня есть несколько движков, которые также являются гемами и приложениями (Rails3). Они являются гемами, поэтому их можно легко установить и управлять зависимостями через несколько пакетов в нескольких приложениях (это целый стек, на котором построено несколько приложений). Они являются двигателями для использования ресурсов Rails - моделей и тому подобного. Они являются приложениями по двум причинам: 1) для обеспечения полной среды тестирования, которая изолирована от их включающих приложений, чтобы вы могли, например, выполнить 'rails c', и 2) для запуска таких вещей, как 'rake db: migrate' и seed, и Больше.
Я хочу, чтобы и мой движок, и мое приложение добавляли некоторые миксины в зависимости более низкого уровня. Вот решение, которое я придумал. Это работает нормально - мне просто интересно, есть ли у кого-нибудь критика подхода или лучшая практика, чтобы поделиться в отношении проблемы совместного использования или общей идеи engine-gem-application:
Двигатель:
#my_engine/lib/my_engine.rb
require 'my_engine/config.rb'
module MyEngine
class Engine < Rails::Engine
config.to_prepare do
MyEngine.inject_mixins
end
end
end
Заявка:
#my_engine/config/application.rb
require 'my_engine/config'
module MyEngine
class Application < Rails::Application
config.to_prepare do
MyEngine.inject_mixins
end
end
end
Миксин:
#my_engine/lib/my_engine/config.rb
module MyEngine
module CLASSMETHODS
def inject_mixins
::ApplicationHelper.send(:include, MyEngine)
::SomeDependency::SomeClass.send(:include, MyEngine::SomeClassMixin)
end
#root should be defined as the root of this engine, ie relative to this file
def root
File.join(File.dirname(__FILE__), '..','..')
end
end
extend CLASS_METHODS
end
(Обновление: я изменил вышеупомянутое, чтобы обернуть модуль в модуле my_engine, иначе более чем один движок, использующий этот шаблон одновременно, может иметь непредсказуемые эффекты, такие как MyEngine.root == SomeOtherEngine.root)