Neu: udemy Kurs Ruby für Anfänger von Stefan Wintermeyer 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.
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.
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 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
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$