Пользователь
0,0
рейтинг
22 февраля 2010 в 14:54

Разработка → Bundler — менеджер для управления gem'ами

Ruby*

Что такое Bundler?


Это менеджер для управления зависимостями gem'ов в ruby приложениях. Эта утилита позволяет легко устанавливать необходимые gem'ы для вашего приложения, при этом вовсе не зависеть от установленных в системе. Если вы использовали Rails для своих разработок, то вы вспомните, как задавали зависимости gem'ов c помощью config.gem в enviroment.rb, Bundler решает эту задачу намного удобнее и проще. Его включили в Rails 3.0 по умолчанию и теперь, именно он используется для управления зависимостями gem’ов в данной версии фреймворка. Эту утилиту можно использовать для любого ruby фреймворка.

Установка


Устанавливаем эту утилиту как любой другой gem:

gem install bundler

Для Rails 3.0 ничего больше делать не нужно, потому как он используется по умолчанию. А для Rails.2.3.x нужно выполнить следующие шаги. C начала добавить ниже приведенный код в boot.rb перед Rails.boot!:

class Rails::Boot
  def run
    load_initializer
    extend_environment
    Rails::Initializer.run(:set_load_path)
  end

  def extend_environment
    Rails::Initializer.class_eval do
      old_load = instance_method(:load_environment)
      define_method(:load_environment) do
        Bundler.require :default, Rails.env
        old_load.bind(self).call
      end
    end
  end
end


Далее создать файл preinitializer.rb в директории config/initializers с содержимым:

begin
  # Require the preresolved locked set of gems.
  require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
  # Fallback on doing the resolve at runtime.
  require "rubygems"
  require "bundler"
  Bundler.setup
end


Конфигурирование


После создании нового Rails приложения в версии 3.0 в корне проекта уже существует файл Gemfile, который является конфигом для Bundler'а. Для версий Rails 2.3.x его нужно создать самому. Для этого нужно перейти в директорию проекта и выполнить команду:

bundle init

В этом файле задаются все необходимые зависимости gem'ов. Рассмотрим какие именно возможности предоставляет данный конфиг файл.

Сперва задается ресурс откуда по умолчанию будут устанавливаться gem'ы:

source 'http://gemcutter.org'

Как уже многие знают ресурс gemcutter.org становится неким стандартом для хранения gem'ов, поэтому при создании конфига именно этот ресурс будет установлен по умолчанию. Но вы легко можете его заменить допустим на gems.github.com или добавить столько ресурсов сколько вам нужно:

source 'http://gemcutter.org'
source 'http://gems.github.com'
source 'http://gems.rubyforge.org'


Далее уже идет список gem'ом которые нужны для работы приложения:

gem 'will_paginate'
gem 'oauth'
gem 'money'


Здесь нужно отметить, что gem'ы можно объединять в группы и далее устанавливать только определенные группы:

group :development do
  gem 'rspec'
  gem 'populator'
  gem 'faker'
end

group :production do
  gem 'memcache-client'
end


Доступна и другая форма объединения gem'ов в группы:

gem 'rspec', :group => 'development'
gem 'populator', :group => 'development'
gem 'memcache-client', :group => 'production'


По умолчанию все gem'ы включаются в группу default.
Если нужна именно конкретная версия gem'а то можно задать ее номер:

gem "rack", "1.0.1"
gem "rails", ">=2.3.2"


Есть возможность задать имя файла который будет подключен во время подключения библиотеки Bundler'ом. По умолчанию это имя gem'а поэтому в большинстве случаев ничего задавать не нужно. Опция которая позволяет задать имя файла для подключения называется require, используется она следующим способом:

gem 'gchartrb', :require => 'google_chart'

В случае если нужно указать git репозитория для скачивания gem'а то нужно использовать опцию git:

gem 'will_paginate', :git => 'git://github.com/mislav/will_paginate.git'

Использование


Как тока задали все нужные gem'ы, нужно выполнить команду:

bundle install

Эта команда решит все зависимости и установит недостающие gem'ы. При этом если выполнить:

gem list

То вы там не увидите gem'ы которые были установлены с помощью bundler'а. Все установленные gem'ы находится в директории ~/.bundler. Откуда он их и будет подключать.
Посмотреть список установленных gem'ов можно с помощью команды:

bundle show

Если нужный gem уже установлен в системе, то для него будет создана ссылка. После каждого изменения файла Gemfile, нужно выполнить команду install. Папка ~/.bundler не является обязательной, если вы хотите установить gem'ы в другую папку, это легко сделать:

bundle install ./vendor/bundler_gems

Если помните, то в конфиг файле есть возможность включать все gem'ы в группы, так вот при установки можно указать какие группы gem'ов не устанавливать:

bundle install —without test

Допустим зачем устанавливать gem'ы на production server который нужны только для тестирования.
Если gem имеет исполняемые файлы, то их можно запускать след образом:

bundle exec cassandra_helper cassandra

Как только вы закончили разработку приложения, нужно заблокировать изменение Gemfile:

bundle lock

После выполнения данной команды создастся файл Gemfile.lock, который будет содержать все зависимости на основе установленых gem’ов у вас на компьютере. Это делается для того чтоб зафиксировать версии gem’ов при которых приложение работает корректно. Данный файл будет иметь следующий вид:

---
dependencies:
  faker:
    group:
    - :development
    version: ">= 0"
  memcache-client:
    group:
    - :test
    version: ">= 0"
  sqlite3-ruby:
    group:
    - :default
    version: ">= 0"
  oauth:
    group:
    - :default
    version: ">= 0"
specs:
- stomp:
    version: 1.1.4
- populator:
    version: 0.2.5
- json:
    version: 1.2.0
- thrift:
    version: 0.2.0
- thrift_client:
    version: 0.3.3
- rspec:
    version: 1.3.0
- ruby-hmac:
    version: 0.4.0
- oauth:
    version: 0.3.6
hash: 0ac3c8666943a1e2294be2851316d83791479451
sources:
- Rubygems:
    uri: gemcutter.org


При этом если вы измените Gemfile и попробуете выполнить команду install, то установка не будет произведена, так как gem’ы заблокированы. Для того чтоб установить новые gem’ы уже в залоченном состоянии, выполняется команда install с параметром relockinstall stall --relock, выполняется командак л нужно заблокировать изминение:

bundle install --relock

В bundler’е предусмотрена возможность упаковки gem’ов:

bundle pack

После выполнения данной команды в директории vendor/cache будут сохранены все нужные gem’ы, впоследствии чего установка gem’ов будет происходить именно с этой директории. Эта опция будет полезна только для тех у кого нет возможности на production server устанавливать gem’ы с публичных репозиториев.

Вот и все, что я хотел вам рассказать об этой удобной утилите. Попробуйте поработать с ней хотя бы час и я думаю, она вам понравится.
Дмитрий Нестерюк @nest_d
карма
28,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (6)

  • +1
    Как уже многие знают ресурс gemcutter.org становится неким стандартом…

    Уже перенесли его позавчера на http://rubygems.org/, окончательно и бесповоротно.
    При обновлении RubyGems до 1.3.6 (sudo gem update --system) рекомендуют заменить строку http://gems.rubyforge.org/ на http://rubygems.org/ в вашем файле ~/.gemrc
  • –1
    Только недавно писали про Bundler: клинетская оптимизация скриптов для .Net. :) Нужно уже для проектов нэймспейсы делать, иначе все путаться будут.
  • +1
    Браво! Спасибо. Прямо сейчас ковыряю третие рельсы как раз на тему «как бы развернуть rails 3.0 приложение на Site5. Зашел отдохнуть, почитать Хабр и вот, как раз то, что нужно.

    То есть, как я понял, достаточно команды bundle pack и развертывание приложения сведется к копированию файлов на сервер? Сам Rails gem тоже туда упакуется (разумеется если его включить в Gemfile) или придется ставить отдельно?
  • 0
    А можно поинтересоваться это вы сами додумались или перевод какой-то статьи? Хотелось бы подписаться на автора.
    • 0
      нет это не перевод, просто разобрался как все работает и написал статью, конечно же читал разные источники
  • 0
    >bundle init

    нет такой команды :(
    предыдущие шаги выполнил.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.