Neu: Rails Schulungen in Deutschland vom Autor dieses Buches. benutzt und es können vom Entwickler weitere Gems hinzugefügt werden. Bundler hilft dem Entwickler dabei, diese ganzen Gems in der richtigen Version zu installieren und auch notwendige Abhängigkeiten zu berücksichtigen. In früheren Rails-Versionen musste man als Entwickler nach einem rails new immer ein bundle install aufrufen. Das wird mittlerweile aber innerhalb von rails new automatisch gemacht. Sie können in der Ausgabe sehen, welche Gems von bundle install installiert werden:
MacBook:~ xyz$ rails new webshop
[...]
         run  bundle install
Fetching gem metadata from https://rubygems.org/.........
Using rake (0.9.2.2) 
Using i18n (0.6.0) 
Using multi_json (1.3.6) 
Using activesupport (3.2.6) 
Using builder (3.0.0) 
Using activemodel (3.2.6) 
Using erubis (2.7.0) 
Using journey (1.0.4) 
Using rack (1.4.1) 
Using rack-cache (1.2) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.1.3) 
Using actionpack (3.2.6) 
Using mime-types (1.19) 
Using polyglot (0.3.3) 
Using treetop (1.4.10) 
Using mail (2.4.4) 
Using actionmailer (3.2.6) 
Using arel (3.0.2) 
Using tzinfo (0.3.33) 
Using activerecord (3.2.6) 
Using activeresource (3.2.6) 
Using bundler (1.1.3) 
Installing coffee-script-source (1.3.3) 
Installing execjs (1.4.0) 
Installing coffee-script (2.2.0) 
Using rack-ssl (1.3.2) 
Using json (1.7.3) 
Using rdoc (3.12) 
Using thor (0.15.4) 
Using railties (3.2.6) 
Installing coffee-rails (3.2.2) 
Installing jquery-rails (2.0.2) 
Using rails (3.2.6) 
Installing sass (3.1.20) 
Installing sass-rails (3.2.5) 
Installing sqlite3 (1.3.6) with native extensions 
Installing uglifier (1.2.6) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
MacBook:~ xyz$ 

Welche Gems von Bundler installiert werden sollen, steht in der von rails new generierten Datei Gemfile:
source 'https://rubygems.org'

gem 'rails', '3.2.6'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'


# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# To use Jbuilder templates for JSON
# gem 'jbuilder'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'debugger'
Das verwendete Format ist leicht erklärt: Auf das Wort gem folgt der Name des Gems und danach bei Bedarf eine Angabe zur Version des Gems.
So steht die Zeile gem 'rails', '3.2.6' für "installiere das Gem mit dem Namen rails in der Version 3.2.6".
Mit ~> vor der Versionsnummer können Sie bestimmen, dass die neueste Version ab dieser Versionsnummer installiert werden soll. Dabei wird innerhalb der letzten Ziffer nach oben gezählt. gem 'rails', '~> 3.2.3' würde entsprechend auch ein Rails 3.2.6, aber nicht ein Rails 3.3 installieren (dazu müsste man gem 'rails', '~> 3.2' eintragen).

Wichtig

Es gibt die Möglichkeit, bestimmte Gems nur in bestimmten Umgebungen zu installieren. Dazu müssen die entsprechenden Zeilen in eine group :name do-Schleife eingeschlossen werden.
Außer der Datei Gemfile gibt es noch die Datei Gemfile.lock und dort werden die genauen Versionen der installierten Gems aufgelistet. Im obigen Bespiel sieht das so aus:
GEM
  remote: https://rubygems.org/
  specs:
    actionmailer (3.2.6)
      actionpack (= 3.2.6)
      mail (~> 2.4.4)
    actionpack (3.2.6)
      activemodel (= 3.2.6)
      activesupport (= 3.2.6)
      builder (~> 3.0.0)
      erubis (~> 2.7.0)
      journey (~> 1.0.1)
      rack (~> 1.4.0)
      rack-cache (~> 1.2)
      rack-test (~> 0.6.1)
      sprockets (~> 2.1.3)
    activemodel (3.2.6)
      activesupport (= 3.2.6)
      builder (~> 3.0.0)
    activerecord (3.2.6)
      activemodel (= 3.2.6)
      activesupport (= 3.2.6)
      arel (~> 3.0.2)
      tzinfo (~> 0.3.29)
    activeresource (3.2.6)
      activemodel (= 3.2.6)
      activesupport (= 3.2.6)
    activesupport (3.2.6)
      i18n (~> 0.6)
      multi_json (~> 1.0)
    arel (3.0.2)
    builder (3.0.0)
    coffee-rails (3.2.2)
      coffee-script (>= 2.2.0)
      railties (~> 3.2.0)
    coffee-script (2.2.0)
      coffee-script-source
      execjs
    coffee-script-source (1.3.3)
    erubis (2.7.0)
    execjs (1.4.0)
      multi_json (~> 1.0)
    hike (1.2.1)
    i18n (0.6.0)
    journey (1.0.4)
    jquery-rails (2.0.2)
      railties (>= 3.2.0, < 5.0)
      thor (~> 0.14)
    json (1.7.3)
    mail (2.4.4)
      i18n (>= 0.4.0)
      mime-types (~> 1.16)
      treetop (~> 1.4.8)
    mime-types (1.19)
    multi_json (1.3.6)
    polyglot (0.3.3)
    rack (1.4.1)
    rack-cache (1.2)
      rack (>= 0.4)
    rack-ssl (1.3.2)
      rack
    rack-test (0.6.1)
      rack (>= 1.0)
    rails (3.2.6)
      actionmailer (= 3.2.6)
      actionpack (= 3.2.6)
      activerecord (= 3.2.6)
      activeresource (= 3.2.6)
      activesupport (= 3.2.6)
      bundler (~> 1.0)
      railties (= 3.2.6)
    railties (3.2.6)
      actionpack (= 3.2.6)
      activesupport (= 3.2.6)
      rack-ssl (~> 1.3.2)
      rake (>= 0.8.7)
      rdoc (~> 3.4)
      thor (>= 0.14.6, < 2.0)
    rake (0.9.2.2)
    rdoc (3.12)
      json (~> 1.4)
    sass (3.1.20)
    sass-rails (3.2.5)
      railties (~> 3.2.0)
      sass (>= 3.1.10)
      tilt (~> 1.3)
    sprockets (2.1.3)
      hike (~> 1.2)
      rack (~> 1.0)
      tilt (~> 1.1, != 1.3.0)
    sqlite3 (1.3.6)
    thor (0.15.4)
    tilt (1.3.3)
    treetop (1.4.10)
      polyglot
      polyglot (>= 0.3.1)
    tzinfo (0.3.33)
    uglifier (1.2.6)
      execjs (>= 0.3.0)
      multi_json (~> 1.3)

PLATFORMS
  ruby

DEPENDENCIES
  coffee-rails (~> 3.2.1)
  jquery-rails
  rails (= 3.2.6)
  sass-rails (~> 3.2.3)
  sqlite3
  uglifier (>= 1.0.3)
Der Vorteil von Gemfile.lock liegt in der damit verbundenen Möglichkeit, dass mehrere Entwickler unabhängig voneinander am gleichen Rails-Projekt arbeiten können und dabei immer sicher sein können, dass alle mit den gleichen Gem-Versionen arbeiten. Ist eine Datei Gemfile.lock, wird diese von Bundler benutzt. Dies ist auch beim späteren Deployment des Rails-Projektes auf einen Webserver praktisch.
Dank dieses Mechanismus, können Sie mehrere Rails-Projekte mit unterschiedlichen Gem-Versionsnummern parallel benutzen und entwickeln.

bundle update

Mit bundle update können Sie Gems auf neue Versionsstände updaten. Als Beispiel habe ich ein Rails-Projekt mit der Rails-Version 3.2.5:
MacBook:webshop xyz$ rails -v
Rails 3.2.5
MacBook:webshop xyz$
In der Datei Gemfile steht diese Version:
MacBook:webshop xyz$ head -n 4 Gemfile
source 'https://rubygems.org'

gem 'rails', '3.2.5'

MacBook:webshop xyz$ 
Ebenso in der Gemfile.lock:
MacBook:webshop xyz$ grep 'rails' Gemfile.lock 
    coffee-rails (3.2.2)
    jquery-rails (2.0.2)
    rails (3.2.5)
    sass-rails (3.2.5)
  coffee-rails (~> 3.2.1)
  jquery-rails
  rails (= 3.2.5)
  sass-rails (~> 3.2.3)
MacBook:webshop xyz$
Wenn wir dieses Rails-Projekt auf die Rails-Version 3.2.6 updaten möchten, müssen wir den Eintrag in der Gemfile-Datei wie folgt ändern:
source 'https://rubygems.org'

gem 'rails', '3.2.6'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'


# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
Nach dieser Änderung können Sie mit bundle update rails die neue Rails-Version installieren (notwendige Abhängigkeiten werden dabei automatisch von Bundler berücksichtigt):
MacBook:webshop xyz$ bundle update rails
Fetching gem metadata from https://rubygems.org/.........
Using rake (0.9.2.2) 
Using i18n (0.6.0) 
Using multi_json (1.3.6) 
Installing activesupport (3.2.6) 
Using builder (3.0.0) 
Installing activemodel (3.2.6) 
Using erubis (2.7.0) 
Using journey (1.0.4) 
Using rack (1.4.1) 
Using rack-cache (1.2) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.1.3) 
Installing actionpack (3.2.6) 
Using mime-types (1.19) 
Using polyglot (0.3.3) 
Using treetop (1.4.10) 
Using mail (2.4.4) 
Installing actionmailer (3.2.6) 
Using arel (3.0.2) 
Using tzinfo (0.3.33) 
Installing activerecord (3.2.6) 
Installing activeresource (3.2.6) 
Using bundler (1.1.4) 
Using coffee-script-source (1.3.3) 
Using execjs (1.4.0) 
Using coffee-script (2.2.0) 
Using rack-ssl (1.3.2) 
Using json (1.7.3) 
Using rdoc (3.12) 
Using thor (0.15.4) 
Installing railties (3.2.6) 
Using coffee-rails (3.2.2) 
Using jquery-rails (2.0.2) 
Installing rails (3.2.6) 
Using sass (3.1.20) 
Using sass-rails (3.2.5) 
Using sqlite3 (1.3.6) 
Using uglifier (1.2.6) 
Your bundle is updated! Use `bundle show [gemname]` to see where a bundled gem is installed.
MacBook:webshop xyz$ rails -v
Rails 3.2.6
MacBook:webshop xyz$

Wichtig

Nach jedem Gem-Update sollten Sie als Erstes Ihre Tests durchlaufen lassen, um ganz sicher zu gehen, dass eine neue Gem-Version nicht ungewollte Seiteneffekte hinzufügt.

bundle outdated

Wenn Sie wissen wollen, welche von Ihrem Rails-Projekt benutzten Gems mittlerweile in einer neuen Version vorhanden sind, können Sie dies mit dem Befehl bundle outdated herausfinden. Beispiel:
MacBook:webshop xyz$ bundle outdated
Fetching gem metadata from https://rubygems.org/.........

Outdated gems included in the bundle:
  * sprockets (2.4.4 > 2.1.3)

MacBook:webshop xyz$

bundle exec

bundle exec gehört wahrscheinlich zu den meist gehassten Befehlen von Rails-Entwicklern. Er wird immer dann benötigt, wenn in einem Rails-Projekt Programme wie rake benutzt werden wollten, die einen anderen Versions-Stand haben, als der Rest des Systems. Die daraus resultierende Fehlermeldung ist allerdings immer leicht umzusetzen:
You have already activated rake 0.10, but your Gemfile requires rake 0.9.2.2. Using bundle exec may solve this.
In diesem Fall hilft es, den Befehl mit einem vorangestellten bundle exec aufzurufen:
MacBook:webshop xyz$ bundle exec rake db:migrate

binstubs

In manchen Umgebungen ist die Verwendung von bundle exec zu umständlich. Für diesen Fall können Sie mit bundle install --binstubs im Verzeichnis bin Programme mit der richtigen Version installieren:
MacBook:webshop xyz$ bundle install --binstubs
Using rake (0.9.2.2) 
Using i18n (0.6.0) 
Using multi_json (1.3.6) 
Using activesupport (3.2.6) 
Using builder (3.0.0) 
Using activemodel (3.2.6) 
Using erubis (2.7.0) 
Using journey (1.0.4) 
Using rack (1.4.1) 
Using rack-cache (1.2) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.1.3) 
Using actionpack (3.2.6) 
Using mime-types (1.19) 
Using polyglot (0.3.3) 
Using treetop (1.4.10) 
Using mail (2.4.4) 
Using actionmailer (3.2.6) 
Using arel (3.0.2) 
Using tzinfo (0.3.33) 
Using activerecord (3.2.6) 
Using activeresource (3.2.6) 
Using coffee-script-source (1.3.3) 
Using execjs (1.4.0) 
Using coffee-script (2.2.0) 
Using rack-ssl (1.3.2) 
Using json (1.7.3) 
Using rdoc (3.12) 
Using thor (0.15.4) 
Using railties (3.2.6) 
Using coffee-rails (3.2.2) 
Using jquery-rails (2.0.2) 
Using bundler (1.1.4) 
Using rails (3.2.6) 
Using sass (3.1.20) 
Using sass-rails (3.2.5) 
Using sqlite3 (1.3.6) 
Using uglifier (1.2.6) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
MacBook:webshop xyz$ ls bin
erubis  rake  ri  scss  tt
rackup  rake2thor sass  thor
rails   rdoc      sass-convert   tilt
MacBook:webshop xyz$
Danach können Sie immer diese Programme benutzen. Beispiel:
MacBook:webshop xyz$ bin/rake db:migrate
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.0018s
==  CreateUsers: migrated (0.0019s) ===========================================

MacBook:webshop xyz$

Weitere Informationen zum Thema Bundler

Das Thema Bundler ist weit komplexer als hier vorgestellt. Folgende Webseiten geben Ihnen einen tieferen Einblick in das Thema Bundler:

Autor

Stefan Wintermeyer