Bundler в Rails – это основной механизм отслеживания и управления зависимостями в загружаемых приложениями gem’ах. При этом сам Bundler – это тоже gem, но он не требует явной установки в Rails 3, так как сам является gem’ом, от которого зависит Rails 3 версии.
Gemfile приложения – манифест файл, находящийся в корне Rails приложения, в котором и перечислены все необходимые для приложения gem’ы, которые по умолчанию не входят в сами Рельсы. Если в приложении нам нужен еще один gem, то мы просто указываем это в нашем Gemfile’е. Именно с этим файлом в первую очередь и работает Bundler для того, чтобы понять, какие gem’ы нужны приложению и от каких gem’ов зависят сами подключаемые gem’ы. Запуск работы Bundler’а происходит так:
$ bundle install
При этом Вundler считывает наименования и версии gem’ов из Gemfile’а, строит полное дерево зависимостей всех gem’ов от других gem’ов, сам решает все конфликтные вопросы и производит загрузку gem’ов. Загрузка нужных версий при этом осуществляется в папку .bundle в пользовательскую директорию. Если при этом нужно осуществить загрузку в директорию приложения, то нужно использовать ключ с указанием имени приложения:
$ bundle install имя_приложения
Однако в этом случае уже ранее загруженные для других приложений gem’ы не грузятся и остаются в папке пользователя. Чтобы загрузить их все повторно в папку приложения используйте:
$ bundle install ипя_приложения --disable-shared-gems
Существует возможность также не просто указывать в Gemfile имена gem’ов, но и их версии, например:
gem 'gemname', '1.1.1'
При этом если версия не указывается, то Bundler загружает последнюю СТАБИЛЬНУЮ версую gem’а.
Можно также указать условия по загрузки желаемых версий, как то:
gem 'gemname', '> 1.1.1' # старше версии 1.1.1
gem 'gemname', '=> 1.1.1' # старше или саму версию 1.1.1
gem 'gemname', '> 1.1.1', '<2.0.0' # старше версии 1.1.1, но 2.0.0 и выше
gem 'gemname', '~> 1.1' # старше версии 1.1, но не 2.0 и выше
Также можно указывать, из какого источника ставить gem (необязательно)
gem 'gemname', :git=>'ссылка на git репозиторий'
И даже с локального компьютера
gem 'gemname', :path=>'локальный путь'
Если какие-то версии gem’ов не были указаны в Gemfile, их можно обновить, запустив команду:
$ bundle update
После установки или обновления gem’ов Bundler создает Gemfile.lock, где будут указаны все специфические версии всех загруженных для приложения gem’ов. Этот файл будет использоваться для развертывания Rails приложения на других машинах с теми же самыми версиями gem’ов.
Существует возможность также развернуть все приложение вместе с gem’ами. Для этого нужно создать пакет gem’ов, который разместится в папке vendor/cache:
$ bundle package
После этого все запуски Bundler’a для приложения будут приводить к установке gem’ов только из данного пакета, а не из внешних источников. Особенно это актуально для Rails-приложений, использующих свои gem’ы, которых нет в публичных источниках.
Последнее замечание. Если вам не нужна работа Bindler’а в приложении – просто удалите файл Gemfile и Bundler перестанет использоваться.