Linuxové distribuce se často stávají terčem kritiky programátorů Ruby, kteří poslední dobou dávají přednost platformě Mac OS. Důvody kritiky, a jak jsme se s nimi ve Fedoře vypořádali, jsem nastínil v článku Fedora 17 a Ruby. Cílem tohoto článku je popsat, jak na Fedoře správně nainstalovat a používat Ruby on Rails, bezesporu nejznámější Ruby framework.

Přitom si ukážeme, jak instalaci přes Yum a Gemy zabalené jako RPM, tak instalaci běžnou, pomocí příkazu gem. Jenom podotknu, že Ruby on Rails jsou ve Fedoře 18 ve verzi 3.2.8, oproti Fedoře 17, kde byla obsažena verze 3.0.11.

Jak jsem uvedl ve výše zmíněném článku, do užívání systémových Gemů (zabalených do RPM) Fedora nikoho nenutí a všechny standardní příkazy jako gem install nebo bundle install na Fedoře fungují zcela normálně, ba ještě lépe než na ostatních linuxových distribucích (není třeba je pouštět jako superuživatel, Gemy se nainstalují do uživatelova domovského adresáře). Pro spouštění všech příkazů používajících Yum samozřejmě musíte použít oprávnění superuživatele (sudo, případně su -c), abyste mohli instalovat do systémových adresářů.

Instalace Ruby on Rails

Pro přístup nevyužívající systémové Gemy je nutné mít nainstalované Ruby a RubyGems z oficiálních repozitářů (instalace systémových Gemů je nainstaluje automaticky jako závislost):

yum install ruby rubygems

Nyní k instalaci samotných Ruby on Rails. Vývojáři Ruby jsou zvyklí instalovat Gemy z rubygems.org pomocí příkazu gem:

gem install rails

Pro nainstalování Ruby on Rails z oficiálních repozitářů lze použít:

yum install rubygem-rails

Vytvoření aplikace

Dále vytvoříme naši testovací aplikaci. Pří použití klasických Gemů spustíme:

rails new app

Tento příkaz vytvoří adresářovou strukturu obsahující potřebné soubory a spustí bundle install, čímž doinstaluje všechny chybějící Gemy. Je zajímavé si všimnout, že bundle install vždy nainstaluje nejnovější verzi Gemu, i pokud už je na systému starší, která splňuje závislosti. Tak se může stát, že vytvoříte dvě aplikace s rozestupem několika dnů, ale ta novější nainstaluje a bude používat odlišné Gemy. A tak se vám na systému s každou další aplikací začíná hromadit spousta verzí Gemů, většinou zcela zbytečně. Líbí se vám to? Mně tedy ne, naštěstí se tomu dá předejít - parametru --skip-bundle se budeme věnovat později.

V závislosti na prostředí vašeho systému tento krok nemusí uspět, kompilují se totiž během něj binární extenze několika Gemů, a tak můžete potřebovat spustit tyto příkazy:

yum install ruby-devel sqlite-devel
cd app && bundle install

Při vytváření aplikace pomocí Gemů z oficiálních repozitářů Fedory nechceme, aby Bundler instaloval žádné závislosti sám, ale aby využil závislostí obsažených v RPM. Proto vytvoříme aplikaci takto:

rails new app --skip-bundle

Tento příkaz pouze vygeneruje aplikaci, ale neinstaluje žádné závislosti. Následně se podíváme na vygenerovaný soubor app/Gemfile. V tom jsou uvedeny Gemy, které aplikace potřebuje a které by jinak Bundler doinstaloval. Při instalaci z oficiálních repozitářů Fedory je musíme doinstalovat sami. V tomto případě bude stačit příkaz

yum install rubygem-sqlite3 rubygem-jquery-rails rubygem-sass-rails \
rubygem-coffee-rails rubygem-uglifier

Pokud chceme vytvořit Gemfile.lock, který zamkne Gemy s aktuálně nainstalovanými verzemi, spustíme

cd app && bundle install --local

Spuštění aplikace

Nyní se pokusíme aplikaci spustit pomocí (předpokladem je, že se nacházíme v adresáři vytvořené aplikace):

rails s

Aplikaci se však spustit nepodaří, protože:

Could not find a JavaScript runtime. ...

Rails se za vás nesnaží při vytváření aplikace rozhodovat, jaký použijete interpreter JavaScriptu. Ano, Rails 3.2.8 mají v Gemfile implicitní závislost na interpreteru JavaScriptu prostřednictvím Gemu "execjs", i když se jí lze vyhnout přepínačem -S při vytváření aplikace (tento přepínač deaktivuje podporu tzv. "asset pipeline", což je skupina Gemů určených pro práci s CSS a JavaScriptem na straně serveru). V Gemfile je nicméně zakomentovaný řádek, který napovídá, co použít:

# gem 'therubyracer', :platforms => :ruby

Pokud řádek "odkomentujeme", a správně doinstalujeme Gem therubyracer, vše funguje.
Uživatelé bundleru po odkomentování řádku pouze znovu pustí

bundle install

Uživatelé systémových Gemů oproti tomu použijí

yum install rubygem-therubyracer
bundle install --local

Tento postup se dá opakovat pro libovolný systémový Gem, který chceme mít uvedený v Gemfile.

Nyní už aplikaci můžeme bez problémů spustit pomocí

rails s

Ve zkratce

Chcete oba postupy v destilované formě? Tady je máte:

Užití Gemů z rubygems.org (Gemy budou nainstalovány do domovského adresáře aktuálního uživatele):

su -c "yum install ruby-devel sqlite-devel"
gem install rails
rails new app
cd app
sed -i "s|# gem 'therubyracer'|gem 'therubyracer'|" Gemfile
bundle install
rails s

Pro uživatele systémových Gemů:

su -c "yum install rubygem-{rails,sqlite3,jquery-rails,sass-rails,\
coffee-rails,uglifier,therubyracer}"
rails new app --skip-bundle
cd app
sed -i "s|# gem 'therubyracer'|gem 'therubyracer'|" Gemfile
bundle install --local
rails s

Srovnání

Jak jsem psal ve svém již zmiňovaném předchozím článku, oba postupy mají něco do sebe.

Gemy z rubygems.org jsou vhodnější pro vývoj, jelikož můžete jednoduše instalovat libovolné verze a mít každý Gem v libovolném počtu verzí.

Systémové Gemy jsou lepší na produkční nasazení, protože mají v rámci jednoho vydání Fedory stabilní verze a jsou spravované námi, balíkáři - takže se můžete spolehnout, že po dobu života vašeho vydání Fedory v nich budou opravovány bezpečnostní a další chyby. Navíc jste si mohli všimnout, že pro instalaci systémových Gemů s binárními extenzemi nepotřebujete kompilátor ani další balíky, jako tomu může být u Gemů instalovaných příkazem gem.

Co dál?

Ve Fedoře 19 se pokusíme přejít na Ruby on Rails 4.0.0 - v závislosti na tom, kdy bude přesně vydané. V plánu je také plná podpora instalace Rails běžících na JRuby. Rubinius je zatím ve stádiu rozpracovanosti a ve Fedoře 19 s největší pravděpodobností nebude. Práce na něm nicméně pokračují, takže nevěšte hlavy!

Přeji vám mnoho dobrých zkušeností s používáním Fedory a těším se na vaše reakce.