Warte uwagi: RVM

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.



Komentarze

  1. MCR 22.09.2010

    Comment Arrow

    Bardzo dobrze opisane i bardzo przydatne. Szczególnie dla użytkowników Apple…


  2. Marioosh 22.09.2010

    Comment Arrow

    Warto dodać, że możemy w folderze umieścić plik .rvmrc w którym wpisujemy coś na wzrór: ‚rvm ruby_version@moj_gemset’. Gdy wejdziemy do tego folderu to RVM automatycznie przestawi interpreter i gemset na wskazane. (Oczywiście gdy wchodzimy w poziomu basha)


  3. Czak 22.09.2010

    Comment Arrow

    @Marioosh: dzięki, .rvmrc rządzi 🙂


  4. Seban 23.09.2010

    Comment Arrow

    Faktycznie przegapiłem 1.0
    @Marioosh nie znałem tego triku, ale już mi się podoba.


  5. Łobuz 18.10.2010

    Comment Arrow

    Jak ktoś jest zmuszony siedzieć jeszcze na windzie, to analogiczną rolę pełni tu pik.


  6. jacek 21.11.2010

    Comment Arrow

    a u mnie coś nie działa:

    rvm use 1.9.2
    Using /usr/local/rvm/gems/ruby-1.9.2-p0
    root@r-laptop:~# ruby -v
    ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2010.01
    root@r-laptop:~# rvm use system
    Now using system ruby.
    root@r-laptop:~# ruby -v
    ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2010.01
    root@r-laptop:~# rvm ruby -v
    ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
    Mogę liczyć na pomoc?


  7. Czak 22.11.2010

    Comment Arrow

    @jacek: podejrzewam, że to ustawienie PATH w systemie. Pamiętaj o tej linii:

    [[ -s „$HOME/.rvm/scripts/rvm” ]] && . „$HOME/.rvm/scripts/rvm”

    i że musi ona być w .bashrc po wszystkich wpisach dotyczących PATH.




O autorze

Łukasz Adamczak

Programuje w Rubym i dłubie w Rails od końca 2007. Przygody z Javą i PHP były krótkie, ale wystarczyły by z pasją i wzajemnością zakochać się w RoR. Wierny członek sekty nadgryzionego jabłka. Od niedawna adept tajemnej sztuki Objective-C.