Saturday, September 3, 2011

Ruby On Rails 3.1 - dzień pierwszy

Zawsze uważałem, że najlepszy poradnik, to zbiór wskazówek pisanych przez początkującego, nie koniecznie zaś zapełniane przez mądrego człowieka annały, które jak na początek, mogą być za mądre. Równocześnie, najlepiej aby początkujący miał już doświadczenie z innymi podobnymi zagadnieniami  jednak w danej technologii był początkujący. Taki układ daje duże szanse, że poradnik będzie profesjonalny, pisany prostym językiem i zrozumiały dla maluczkich, którzy oczekują prowadzenia krok po kroku. Mam nadzieję, że moje wpisy o Ruby On Rails 3.1 takie właśnie będą.

Dlaczego?

Mam za sobą już, od jakiegoś czasu, Rails for Zombies, czytałem o Ruby On Rails i jeszcze nigdy nie spotkałem się z osobą, która zaczęłaby kurs Railsów od RVM. Podstawy podstaw - jak na mój gust.

Gdy piszesz jakikolwiek program, aplikację musisz zdecydować się na dwie rzeczy: wersję języka programowania i wersję pozostałych bibliotek, które używasz. U mnie to wygląda tak: zaglądam na stronę języka programowania (w tym przypadku języka Ruby), zaglądam na stronę biblioteki (w tym przypadku Railsów) i nakręcam się na napisanie aplikacji w najnowszej wersji, która wprowadza najświeższe udogodnienia, nowości, nowatorskie technologie i wszystko co sprawia, że bycie geekiem jest piękne i pełne wrażeń jak przejażdżka górską kolejką w parku "Six Flags Great Adventure".

Później przychodzi faza druga, która nazywa się "sprawdźmy co jest na serwerze" i ta przynosi znacznie więcej rozczarowań, niż radości dopóki nie używasz ArchLinux lub nie jesteś twórcą biblioteki, której właśnie zamierzasz użyć. Wtedy klniesz pod nosem, że "przecież administrator mógł przejść na sida" i jakbyś tylko miał uprawnienia użytkownika root!
I tutaj właśnie objawia się piękno RVM. Pozwala ono bowiem bez uprawnienia super-użytkownika zainstalować dowolne wersje języka Ruby, w locie podmieniać interpreter oraz wersje używanych bibliotek, które w wielu różnych kombinacjach mogą koegzystować w wirtualnych środowiskach zwanych gemsetami. Wszystko bez wychodzenia poza katalog domowy.


Ruby Version Manager to nic innego jak współcześnie bardzo ważna tendencja do "usamodzielniania" środowiska developerskiego od bibliotek leżących w systemie. W czasach kiedy powierzchnia dyskowa tanieje, wszędzie poza Google App Engine, trzymanie kolejnej kopii interpretera języka Ruby czy kilkunastu wersji Railsów aż tak bardzo nie boli, a niesie ze sobą wiele korzyści. Po pierwsze: nie jesteśmy uzależnienie od tego jaka wersja biblioteki jest w systemie. Możemy używać aplikacji dokładnie w takich wersjach w jakich są nam potrzebne. Raczej nie nam, tylko projektowi. Po drugie: bez względu na aktualizacje systemu operacyjnego i znajdujących się w nim paczek możemy zostać przy starszej wersji. To bardzo użyteczne, szczególnie dla administratorów, którym widok wersji Rubego 1.9 przychodzącej wraz z najnowszym apt-get update && apt-get upgrade nie podnosi ciśnienia na myśl o niekończącym się horrorze zgłaszających się falami użytkowników, którym "strona nie działa". Jak widać korzyści są obopólne - nawet portfel wygląda jakby przeszedł na dietę.

Jak?

Instalacja

Instalacja i włączenie  RVM to wykonanie polecenia

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
i wrzucenie do .bashrc startowania naszego środowiska
echo '[[ -s "/home/user/.rvm/scripts/rvm" ]] && source "/home/user/.rvm/scripts/rvm" # This loads RVM into a shell session.' >> ~/.bashrc
Ascezą byłoby nie skorzystanie z uzupełniania składni w shellu, więc czeka nas jeszcze komenda:
echo '[[ -r $rvm_path/scripts/completion ]] && . $rvm_path/scripts/completion' >> ~/.bashrc
 Teraz możesz się prze logować lub pójść do Zoo albo odpalić komendę dla leniwych:

. ~/.bashrc

i cieszyć się zainstalowanym  Ruby Version Manager.

Instalacja języka Ruby w RVM


Na początek zainstalujemy, któryś z dostępnych interpreterów języka Ruby. Zobaczmy co ma nam do zaoferowania nasze nowe narzędzie:
rvm list known
Jak widać jest tego dużo. Możemy liczyć na dostęp do wielu niecodziennych implementacji Rubyego jak: MacRuby, MagLev, IronRuby, jRuby czy Rubinius. Nas interesuje najnowsza, stabilna wersja natywnego intepretera języka, czyli na tą chwilę [ruby-]1.9.2[-p290].
Instalujemy nasze cacko i ustawiamy je jako domyślny interpreter:
rvm install 1.9.2
Tworzenie gemsetu dla projektu

RVM Best Practicies zaleca tworzenie konfiguracji/pudełka, zwanego gemset, dla każdego projektu z osobna. Dlatego zanim zainstalujemy  Railsy włączymy konfigurację per-projekt:

echo "rvm_project_rvmrc=1" >> ~/.rvmrc&& source ~/.bashrc
Tworzymy folder, w którym będzie trzymali bebechy naszej aplikacji i włączamy w niej magię RVMa. Moja będzie nosiła imię kolibra z Pocahontas.
mkdir -p ~/projects/flit
cd ~/projects/flit
rvm --rvmrc --create ruby-1.9.2@flit
W nomenklaturze używanego narzędzia przyjęło się iż gemsety (pudełka, w którym trzymane są biblioteki, zwane w Rubym gemami) nazywa się wersja-rubego@nazwa-projektu. Ostatnia linijka stworzyła w folderze flit plik .rvmrc oraz nowy gemset, który zobaczymy po wykonaniu polecenia rvm list gemsets
rvm gemsets

   ruby-1.9.2-p290@global [ x86_64 ]
   ruby-1.9.2-p290 [ x86_64 ]
=> ruby-1.9.2-p290@flit [ x86_64 ]
Dzięki plikowi .rvmrc za każdym razem po wejściu do folderu projektu flit omawiane narzędzie auto-magicznie przełączy wersję języka Ruby i zestaw, za pierwszym razem informując o próbie wykonania skryptu, który należy wykonać potwierdzając literką y
Do you wish to trust this .rvmrc file? (/home/johny/projects/flit/.rvmrc)
y[es], n[o], v[iew], c[ancel]> y
Instalacja Railsów

Teraz można w spokoju zainstalować nasz framework:
cd ~/projects/flit
rvm gemset install rails
Podsumowanie

Zainstalowaliśmy Railsy, jednak nie sam fakt jest najważniejszy, ale metoda. Zainstalowaliśmy je w katalogu domowym, w wybranej przez nas wersji języka Ruby odizolowując wersje wybranych gemów w tak zwanym gemsetcie. Dzięki temu jesteśmy niezależni od wszelkich zmian w systemie operacyjnym czy nawet "niebezpieczeństwa" rozpoczęcia, tuż obok, projektu z użyciem starszej wersji, która w zwykłej sytuacji kolidowałaby z "trójką". Możemy tworzyć wiele projektów opartych o Ruby On Rails nie martwiąc się o mnogość i różnorodność wersji potrzebnych bibliotek.

1 comment:

Gucman's Journal said...

"Jak widać korzyści są obopólne - nawet portfel wygląda jakby przeszedł na dietę."

No to słabo...
Chyba jednak nie to chciałeś powiedzieć ;)