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.
2. 3. 2013 at 00:22
No a proč tak složitě? Není jednodušší prostě ten interpret javascriptu nainstalovat? Exejs pokud vím podporuje mozillu i v8. Asi mi něco uniká.
Pěkný článek.
4. 3. 2013 at 09:16
Diky za reakci.
1) Gem therubyracer je v podstate wrapper okolo v8.
2) Execjs momentalne Mozilla Spidermonkey nepodporuje [1]
Abych pravdu rekl, moc nechapu co je na tom mem postupu tak slozite. Kde se skryva to zjednoduseni?
[1] https://github.com/sstephenson/execjs/issues/96