W cieniu wydania Ruby'ego 1.9.2 czy Rails 3.0 bez większego echa przemknęła wersja 1.0 projektu, który w krótkim czasie wkradł się do arsenału wielu developerów i jest jednym z niezastąpionych narzędzi w pracy z Rubym. RVM, czyli Ruby Version Manager służy do łatwej instalacji, zarządzania i wydajnej pracy z różnymi wersjami interpretera Ruby'ego. Jeśli jeszcze nie korzystasz, myślę, że po tym krótkim tekście zaczniesz.

Po co mi to?

W większości porządnych systemów operacyjnych Ruby jest instalowany domyślnie lub dostępny na wyciągnięcie ręki (czyt. na wywołanie apt-get, yum czy innego port). Trzeba jednak pogodzić się z - jedyną słuszną - wersją dostępną w pakietach systemowych lub podjąć walkę i konfigurować, kompilować i instalować żądaną wersję ręcznie. Tu nie koniec schodów, gdyż któregoś radosnego dnia przychodzi czas na instalację 1.9 i mamy kłopot. Siedem rozgrzebanych projektów wykorzystujących 1.8 pewnie nie będzie zadowolonych kiedy nagle ?o zwróci "o" zamiast 111. Niektóre dystrybucje przygotowały się na to i dystrybuują pliki binarne z suffixami 18 lub 19. Mamy wtedy już 2 opcje. Ale co z JRuby? A co z gemami?

I tak narodził się RVM.

Dla niecierpliwych:

$ rvm install 1.9.2
$ rvm use 1.9.2
$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.3.0]
$ rvm use system
$ ruby -v
ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-darwin10]

Jak zacząć?

Sugerowaną metodą instalacji jest wykorzystanie skryptu dostarczonego przez autora. Jedna komenda załatwi 95% instalacji - sklonuje repozytorium z GitHuba, przygotuje katalog w $HOME i wgra wszystkie skrypty RVMa:

$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Po zakończeniu skryptu należy tylko dodać jedną linię na końcu .profile (lub .bash_profile etc):

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

Pamiętaj, aby dodać tę linię po wszystkich zmianach w $PATH. Inaczej mogą one nadpisać ścieżki ustawianie przez RVM (tak dzieje się np. z MacPortsami, które zawsze doklejają swoje ustawienia ścieżek na końcu .bash_profile).

Aby zobaczyć listę dostępnych środowisk wywołaj:

$ rvm list known

Lista aktualnie zawiera MRI w wersjach 1.8.6, 1.8.7, 1.9.1 i 1.9.2 (każda w kilku odmianach), kilka wersji JRuby, Rubiniusa, REE, MagLev i MacRuby. Instalujemy wywołując jedynie:

$ rvm install 1.9.2

Jeśli życzysz sobie konkretną wersję, wpisz np:

$ rvm install 1.9.2-head

RVM ściągnie, skonfiguruje i skompiluje wybrany wariant. Cała instalacja odbywa się w katalogu domowym bieżącego usera, pamiętaj więc aby nie używać sudo! Wszystkie wersje Ruby'ego będą sobie grzecznie mieszkały w $HOME/.rvm/rubies, zaś gemy dla każdej z nich w $HOME/.rvm/gems.
Po zakończeniu instalacji przełącz się do wybranej używając:

$ rvm use 1.9.2

Sprawdźmy czy zadziałało

$ which ruby
/Users/Czak/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.3.0]

Co dalej?

W każdej chwili możemy przywrócić stan przed-RVM, czyli wrócić do wykorzystania systemowego interpretera:

$ rvm use system

RVM nie narzuca wykorzystania żadnej z zainstalowanych wersji. Domyślnie każda sesja shella wykorzystuje systemowy interpreter, a dopiero po użyciu rvm use jest on przełączany na jedną z zainstalowanych wersji. Aby wymusić domyślną wersję możesz jednak wywołać:

$ rvm --default 1.9.2

Komenda rvm daje potężną możliwość pracy na wielu interpreterach na raz. Modelowym przykładem jest uruchomienie skryptu na wszystkich - lub niektórych - zainstalowanych wersjach Ruby'ego:

$ rvm list
rvm rubies
=> ruby-1.8.7-p302 [ x86_64 ]
   ruby-1.9.2-p0 [ x86_64 ]
$ echo "puts RUBY_VERSION" > version.rb
$ rvm version.rb
1.8.7
1.9.2

Analogicznie można pracować z gemami, instalując wymagane na kilku wersjach jednocześnie:

$ rvm 1.8.7,1.9.2 gem install rails --no-ri --no-rdoc

Bardzo przydatną funkcją są gemsety, czyli zestawy gemów, między którymi można wygodnie przełączać się i w ten sposób testować np. współpracę naszej aplikacji z nową wersją Rails. Chcąc np. uaktualnić aplikację z 2.3.5 do 2.3.9 możemy utworzyć niezależny zestaw gemów nazwany np. rails239 i w trakcie migracji przełączać się między nim a domyślnym:

$ rvm 1.8.7
$ rails --version
Rails 2.3.5
$ rvm gemset create rails239
'rails239' gemset created (/Users/Czak/.rvm/gems/ruby-1.8.7-p302@rails239).
$ rvm 1.8.7@rails239
$ gem install rails -v 2.3.9
$ rails --version
Rails 2.3.9

Co (jeszcze) dalej?

Powyższe wprowadzenie bynajmniej nie wyczerpuje możliwości RVM. Zachęcam do czytania świetnej dokumentacji dostępnej na stronie domowej projektu. W razie pytań możecie też śmiało walić na nasz rubysferowy blip lub stronę Rubysfery na Facebooku.