Ruby 1.9 via RVM + Ruby on Rails 3 + Bundler unter Mac OS X 10.7 "Lion" Howto
Einleitung
Als Ruby und Ruby on Rails Entwickler ist man oft an mehreren Projekten gleichzeitig am Arbeiten, wobei jedes der Projekte eine eigene Umgebung (bspw. unterschiedliche Ruby Versionen, unterschiedliche Gems in bestimmten Versionen etc.) benötigt. Lange Zeit mussten sich Ruby und Ruby on Rails Entwickler gedulden und mit einem teilweise chaotischen Mix aus verschiedenen Ruby-Versionen und mehrfach installierten Gems in unterschiedlichen Versionen leben. Üblicherweise wurden in derartigen Szenarien alle Gems systemweit installiert und somit war das Chaos vorprogrammiert.
Da gerade Ruby on Rails Projekte u.U. eine enorme Anzahl von Gems benötigen und mehrere Projekte zwangsläufig irgendwann kollidieren wurde ein Tool erschaffen, das diese Problematik sauber angeht und für jedes Ruby bzw. Ruby on Rails Projekt jeweils eine eigene, isolierte Umgebung schafft. Dabei können unterschiedliche Ruby Versionen, wie bspw. Ruby 1.8, Ruby 1.9, Ruby Enterprise oder gar jRuby für die jeweiligen Projekte verwendet werden und jedes der Projekte ein eigenes Gemset verwenden, das mit den anderen Projekten nicht kollidiert.
In diesem Howto möchte ich die Installation von Ruby 1.9 und Ruby on Rails 3 auf einem Mac OS X 10.7 “Lion” System erläutern und einen Weg aufzeigen, wie die aktuelle Version von Ruby 1.9.2 parallel zu der Standard-Ruby-Installation, die mit bei Mac OS X 10.7 “Lion” daherkommt (im Normalfall 1.8.7), betrieben werden kann und wir jederzeit zwischen den beiden Versionen mittels RVM (Ruby Version Manager) hin- und herschalten können.
Installation von benötigter Software
Der Ruby Version Manager (RVM) benötigt die XCode Tool Suite mindestens in der Version 3.2.1 (1613). Für eine saubere Installation von Ruby 1.9 und Rails 3 empfehle ich die Installation der aktuellsten XCode Version. Zum jetzigen Zeitpunkt ist Xcode in der Version 4.1 verfügbar, die direkt aus dem AppStore kostenlos heruntergeladen werden kann (Stand: August 2011).
Installation von RVM
Zunächst einmal installieren wir den Ruby Version Manager (RVM), mit dessen Hilfe wir eine Vielzahl von parallelen Ruby-Installationen und Versionen verwalten können. Persönlich verwende ich Ruby 1.8.7 ausschließlich für bereits implementierte Ruby on Rails 2 Projekte und Ruby 1.9.2 für die aktuellen Neuentwicklungen in Ruby on Rails 3. Neben der Tatsache, dass wir mittels RVM sowohl Ruby 1.8 als auch Ruby 1.9 installieren können, bietet der RVM einen weiteren immensen Vorteil: wir können pro Ruby bzw. Ruby on Rails Projekt je eine Ruby-Installation samt allen von den Projekten benötigten Gems kapseln. Insbesondere beim Arbeiten an mehreren parallelen Projekten, trägt dieses Vorgehen entscheidend dazu bei, diese sauber voneinander zu isolieren und so Wechselwirkungen von verschiedenen Ruby-Umgebungen zu vermeiden.
Wir installieren RVM via GitHub, indem wir den Quellcode des Projekts auschecken und installieren:
$ mkdir -p ~/.rvm/src
$ cd ~/.rvm/src
$ rm -rf ./rvm
$ git clone --depth 1 git://github.com/wayneeseguin/rvm.git
$ cd rvm
$ ./install
Nach einer erfolgreichen Basisinstallation des RVM präsentiert uns der Installer einen längeren Text, den wir sorgsam durchlesen sollten.
Damit RVM in die Shell Sessions geladen wird, führen wir das folgende Kommando aus:
$ echo "[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm" >> ~/.bash_profile
Anschließend schließen wir das aktuelle Terminalfenster, öffnen ein neues und setzen darin das folgende Kommando ab:
$ rvm version
Daraufhin sollten wir einige Informationen über den auf unserem System installierten RVM erhalten:
rvm 1.8.0 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]
Installation von Ruby 1.9.2
Nachdem wir den Ruby Version Manager (RVM) installiert haben, öffnen wir eine neue Shell und überprüfen zunächst, welche Ruby Versionen installiert werden können:
# rvm list known
Die Liste der unterstützten Ruby-Varianten und Ruby-Versionen ist relativ lang:
# MRI Rubies [ruby-]1.8.6[-p420] [ruby-]1.8.6-head [ruby-]1.8.7[-p352] [ruby-]1.8.7-head [ruby-]1.9.1-p378 [ruby-]1.9.1[-p431] [ruby-]1.9.1-head [ruby-]1.9.2-p180 [ruby-]1.9.2[-p290] [ruby-]1.9.2-head [ruby-]1.9.3[-preview1] [ruby-]1.9.3-head ruby-head# GoRuby goruby# JRuby jruby-1.2.0 jruby-1.3.1 jruby-1.4.0 jruby-1.6.1 jruby-1.6.2 jruby-1.6.3 jruby[-1.6.4] jruby-head# Rubinius rbx-1.0.1 rbx-1.1.1 rbx-1.2.3 rbx-1.2.4 rbx[-head] rbx-2.0.0pre# Ruby Enterprise Edition ree-1.8.6 ree[-1.8.7][-2011.03] ree-1.8.6-head ree-1.8.7-head# Kiji kiji# MagLev maglev[-26355] maglev-head# Mac OS X Snow Leopard Only macruby[-0.10] macruby-nightly macruby-head# IronRuby -- Not implemented yet. ironruby-0.9.3 ironruby-1.0-rc2 ironruby-head
Wir installieren Ruby in der momentan aktuellen Version 1.9.2-p290 (Stand: August 2011) mittels:
$ rvm install 1.9.2
Wie wir der Meldung des RVM entnehmen können, wird dabei Ruby 1.9.2 im Verzeichnis $HOME/.rvm/rubies/ruby-1.9.2-p290 installiert:
Installing Ruby from source to: $HOME/.rvm/rubies/ruby-1.9.2-p290, this may take a while depending on your cpu(s)...ruby-1.9.2-p290 - #fetching ruby-1.9.2-p290 - #downloading ruby-1.9.2-p290, this may take a while depending on your connection... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 8604k 100 8604k 0 0 779k 0 0:00:11 0:00:11 --:--:-- 923k ruby-1.9.2-p290 - #extracting ruby-1.9.2-p290 to $HOME/.rvm/src/ruby-1.9.2-p290 ruby-1.9.2-p290 - #extracted to $HOME/.rvm/src/ruby-1.9.2-p290 Fetching yaml-0.1.4.tar.gz to $HOME/.rvm/archives % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 460k 100 460k 0 0 181k 0 0:00:02 0:00:02 --:--:-- 195k Extracting yaml-0.1.4.tar.gz to $HOME/.rvm/src Configuring yaml in $HOME/.rvm/src/yaml-0.1.4. Compiling yaml in $HOME/.rvm/src/yaml-0.1.4. Installing yaml to $HOME/.rvm/usr ruby-1.9.2-p290 - #configuring ruby-1.9.2-p290 - #compiling ruby-1.9.2-p290 - #installing Retrieving rubygems-1.8.6 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 244k 100 244k 0 0 269k 0 --:--:-- --:--:-- --:--:-- 837k Extracting rubygems-1.8.6 ... Removing old Rubygems files... Installing rubygems-1.8.6 for ruby-1.9.2-p290 ... Installation of rubygems completed successfully. ruby-1.9.2-p290 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake). ruby-1.9.2-p290 - #importing default gemsets ($HOME/.rvm/gemsets/) Install of ruby-1.9.2-p290 - #complete
Je nach Leistung des verwendeten Rechners kann dieser Schritt einige Zeit in Anspruch nehmen. Anschließend lassen wir uns die auf unserem System installierten Ruby-Versionen anzeigen mittels:
$ rvm list
rvm rubiesruby-1.9.2-p290 [ x86_64 ]
Soll Ruby 1.9.2 die Standardversion ersetzen, führen wir das folgende Kommando aus:
$ rvm 1.9.2 --default
Um zu überprüfen, ob die richtige Ruby-Installation nun systemweit verwendet wird, führen wir das folgende Kommando aus:
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
Anmerkung: um eine bestimmte Ruby-Version temporär (nur in der geöffneten Shell) zu setzen, können wir das folgende Kommando verwenden:
$ rvm 1.9.2
Um die Standardinstallation von Ruby wiederum zu aktivieren, verwenden wir den folgenden Befehl:
$ rvm system
bzw. für eine dauerhafte Änderung:
$ rvm system --default
Installation von Ruby on Rails 3
Nachdem wir Ruby selbst in der aktuellen Version 1.9.2 installiert haben, können wir nun die weiteren Komponenten, die wir zum Entwickeln von Ruby bzw. Ruby on Rails Anwendungen benötigen, in Form von Ruby Gems installieren. Während ohne die Verwendung von RVM die entsprechenden Gems in den meisten Fällen systemweit installiert wurden, können wir an dieser Stelle die Vorzüge von RVM nutzen und die benötigte Ruby-Variante/-Version und die jeweiligen Gems in einem sogenannten Gemset kapseln.
An dieser Stelle müssen wir nur die Gems systemweit installieren, die ausnahmslos in jedem Gemset enthalten sein müssen. In diesem Fall benötigen wir bspw. nur Bundler in jedem der Projekt-Gemsets, um dem hier beschriebenen Schema folgen zu können. Von daher installieren wir Bundler in das globale Gemset mittels:
$ rvm ruby-1.9.2-p290@global
$ gem install bundler
Damit ist Bundler in jedem weiteren Gemset in unserer Ruby 1.9.2 Umgebung verfügbar.
Nun sollten wir die Ruby-Version auswählen, die wir zur Entwicklung eines Ruby on Rails Projekts heranziehen wollen. Da ich an dieser exemplarisch diesen Weg für ein Rails 3 Projekt aufzeigen möchte, verwende ich dafür Ruby 1.9. Von daher switchen wir zunächst zu Ruby 1.9.2 mittels:
$ rvm 1.9.2
Anschließend erzeugen wir ein neues Gemset, dessen Name bspw. dem Projektnamen entsprechen kann:
$ rvm gemset create rails3_example
Wir erhalten dabei die folgende Meldung:
'rails3_example' gemset created ($HOME/.rvm/gems/ruby-1.9.2-p290@rails3_example).
Nun switchen wir in das jeweilige Gemset mittels:
$ rvm ruby-1.9.2-p290@rails3_example
... und installieren darin u.a. Ruby on Rails 3
$ gem install rails
Anmerkung: da wir an dieser Stelle unsere Gems nicht mit Root-Rechten installieren, werden diese – wie bereits die Ruby-Installation selbst – in einem lokalen Verzeichnis unter $HOME/.rvm/rubies/ruby-1.9.2-p290 gekapselt. Wie bereits oben beschrieben, können wir durch die gekapselten Ruby-Umgebungen komfortabel mehrere Rails-Projekte voneinander isolieren.
Anschließend überprüfen wir, ob Rails 3 installiert wurde:
$ rails -v
In unserem Fall erhalten wir die folgende Ausgabe:
Rails 3.0.10
Anbindung an die Datenbank
Je nachdem, welche Datenbank verwendet wird, müssen wir noch das entsprechende Ruby-Gem installieren. Persönlich verwende ich in den meisten Fällen PostgreSQL sowohl zur Entwicklung von Webapplikationen als auch für den späteren Produktivbetrieb.
Verwendet man PostgreSQL als Datenbank für das Backend, benötigt man eine zusätzliche Ruby-Bibliothek, um auf PostgreSQL zugreifen zu können:
$ gem install pg
