Вопрос от Bundler Capistrano: Как Rails узнает, где находятся мои драгоценные камни? - PullRequest
8 голосов
/ 17 марта 2011

Я использую стандартный рецепт bundler / capistrano, который устанавливает все необходимые драгоценные камни на сервер after deploy:update_code

Работает как шарм и значительно упростил мою жизнь.

Я использую Rails 2.3.10, «залатал» boot.rb и создал преинициализатор так, как было необходимо.

Мой вопрос: как Rails узнает, что мои гемы находятся в каталоге shared / bundle, и как он знает, как их использовать? Этот каталог каким-то образом автоматически добавляется в путь загрузки? Как эти драгоценные камни имеют прецедент над системными драгоценными камнями?

Ответы [ 2 ]

11 голосов
/ 18 марта 2011

jdl, спасибо за советы, где искать.Вот мое понимание того, что происходит.

Bundler автоматически устанавливает гем в shared / bundle, как указано с помощью bundle_dir из Gemfile, по умолчанию это:

# (line 39 bundler/deployment.rb)
set :bundle_dir, File.join(fetch(:shared_path), 'bundle')

:shared_pathпроисходит от Capistrano

Так что это первый шаг установки драгоценных камней.Теперь, насколько я понимаю, когда вы указываете каталог для установки гемов, Bundler всегда изменяет .bundle/config в корневом каталоге (т. Е. Там, где находится Gemfile).Вот как выглядит мой пакет после установки пакета в общий каталог:

--- 
BUNDLE_DISABLE_SHARED_GEMS: "1"
BUNDLE_WITHOUT: development:test
BUNDLE_FROZEN: "1"
BUNDLE_PATH: /mnt/apps/my_app/shared/bundle

Затем (как указано в jdl) GEM_HOME устанавливается на основе этого .bundle / config.

Метод configure_gem_home_and_path в bundler.rb устанавливает ENV['GEM_HOME'], и он основан на некоторых настройках, которые через запутанный процесс в конечном итоге получают BUNDLE_PATH из вашего .bundle / config.

whew...

0 голосов
/ 17 марта 2011

Переменная среды GEM_HOME - это то, что вы ищете.

Документы здесь.

...