Я использовал Rails некоторое время и всегда использовал gems в своем gemfile, но я никогда не понимал, как функциональность самоцветов, которые я устанавливаю, становится доступной. Скажем, я использую gem has_permalinks (http://haspermalink.org/). Он предоставляет метод .generate_permalink!
для моей модели. Где этот метод определяется? Почему просто я могу использовать этот метод внезапно, просто установив драгоценный камень? Есть ли какой-то include
/require
/load
для инициализации кода драгоценного камня, чтобы он стал доступен для остальной части приложения? Кроме того, где этот код хранится при установке драгоценного камня?
Rails + Gems (в общем): Как работают драгоценные камни?
Ответ 1
Я ответил на ваши вопросы отдельно и вышел из строя, но я думаю, что на самом деле это может облегчить понимание ответов в этом порядке.
Также, где этот код хранится при установке драгоценного камня?
Если вы используете Bundler, вы можете сделать bundle show has_permalink
, и он покажет вам, где этот драгоценный камень установлен. Вот пример того, как я делаю это с камнем pg
:
✗ bundle show pg
/Users/jasonswett/.rvm/gems/[email protected]/gems/pg-0.11.0
Где этот метод определяется?
Если вы выполняете bundle show
вещь, она возвращает путь - метод определен где-то там. (Вы можете использовать grep -r 'def generate_permalink' /gem/path
, чтобы найти именно там, где хотите.)
Почему просто я могу использовать этот метод внезапно, просто установив драгоценный камень? Существует ли какая-либо функция include/require/load для инициализации чтобы он стал доступным для остальной части приложение?
Посмотрите на эту часть документа о процессе инициализации Rails: http://guides.rubyonrails.org/initialization.html#config-boot-rb
В стандартном приложении Rails theres Gemfile, который объявляет все зависимостей приложения. config/boot.rb ENV [ "BUNDLE_GEMFILE" ] в местоположение этого файла, затем требуется Bundler и вызывает Bundler.setup, который добавляет зависимости (включая все части Rails) к пути загрузки, что делает они доступны для загрузки приложения.
Похоже, на раннем этапе Rails смотрит на ваш Gemfile и загружает все ваши драгоценные камни через Bundler. Так что там есть.