Mit dem Ruby Version Manager lassen sich auf einem System mehrere Ruby-Versionen parallel installieren. Außerdem können Sammlungen von Gems angelegt werden. Auf diese Weise können für einzelne Projekte oder Entwicklungszweige eigene Umgebungen bereitgestellt werden. Hierdurch werden insbesondere Upgrades des Ruby-Interpreters oder ausgewählter Gems vereinfacht, da die Änderungen keine Auswirkungen aufs Gesamtsystem haben.
Mein konkreter Anwendungsfall besteht in der Aktualisierung einer Applikation, die momentan auf Rails 2.3.2 basiert und Ruby 1.8.7 nutzt. Zukünftig sollen Rails 3.0 und Ruby 1.9.2 zum Einsatz kommen. Außerdem möchte ich keine globalen Gems mehr nutzen – vielmehr soll jedes Projekt ein eigenes Gemset bekommen. Das macht alles übersichtlicher und wartbarer.
Installation
Als erstes sollten alle nötigen Software-Pakete auf dem System vorhanden sein. Auf meinem Rechner läuft Ubuntu 9.04, wo die Installation des RVM wie folgt abläuft:
$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
Als nächstes muss die Datei .profile bearbeitet werden:
Die folgende Anweisung muss am Ende eingefügt werden:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
Nun muss noch .bashrc angepasst werden:
#[ -z "$PS1" ] && return
if [[ -n "$PS1" ]] ; then
...
# ganz unten
fi
# am Ende
if [[ -s $HOME/.rvm/scripts/rvm ]] ; then source $HOME/.rvm/scripts/rvm ; fi
Nach dem öffnen einer neuen Shell kann man die Installation testen:
Bei Erfolg wird folgende Meldung ausgegeben:
Zu guter Letzt muss RVM noch geladen werden:
$ source ~/.rvm/scripts/rvm
Ruby-Interpreter installieren
Als nächstes installiere ich zwei Ruby-Versionen: die von der Anwendung aktuell genutzte, sowie die zukünftig zu verwendende. Eigentlich sollte ich auch den genauen Patch-Level angeben, was ich der Einfachheit halber unterlasse.
$ rvm install 1.8.7
$ rvm install 1.9.2
So kann man eine bestimmte Version zum Default machen – diese Auswahl gilt für alle Shells und Anwendungen:
$ rvm --default 1.9.2
$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
Gemsets anlegen
Ich lege nun zwei Gemsets an. Das erste ist für die zu aktualisierende Anwendung und das zweite für deren aktuellen Stand. Bevor das zweite erstellt werden kann, muss noch die die alte Ruby-Version ausgewählt werden.
$ rvm gemset create my_app
'my_app' gemset created (/home/kai/.rvm/gems/ruby-1.9.2-p0@my_app).
$ rvm 1.8.7
$ rvm gemset create my_app
'my_app' gemset created (/home/kai/.rvm/gems/ruby-1.8.7-p302@my_app).
Bevor nun Gems installiert werden, möchte ich unterbinden, dass deren Dokumentationen mitgeladen werden.
$ nano ~/.gemrc
# ans Ende der Datei
install: --no-rdoc --no-ri
update: --no-rdoc --no-ri
Nun das gewünschte Gemset auswählen und zum Default machen. Danach beginnt die eigentliche Arbeit: Alle benötigten Gems installieren, Anwendung zum Laufen kriegen, testen und dann das Update auf Rails 3 usw. durchführen.
$ rvm use 1.8.7@my_app --default
# Gems istallieren ... Anwendung testen etc.
$ rvm use 1.9.2@my_app --default
# Gems istallieren ... nötige Änderungen an der Anwendung für Rails 3
Fazit
Bisher bin ich sehr zufrieden mit dem RVM. Beim immer noch laufenden Upgrade-Prozess habe ich häufig Gebrauch von den verschiedenen Funktionen gemacht. Wenn man beispielsweise versehentlich falsche Versionen von Gems samt Abhängigkeiten installiert, kann man mit $ rvm gemset empty my_app das Gemset leeren. Alle Gems werden entfernt und man kann von vorne anfangen. RVM bietet aber noch viel mehr Möglichkeiten, die alle sehr gut in der Dokumentation beschrieben werden.