Když jsem se poprvé dozvěděl o rubínových drahokamech, připadaly mi docela kouzelné. Spuštěním bundle install
jsem mohl nějakým způsobem získat tyto kouzelné drahokamy, které by můj kód přiměly dělat nejrůznější věci, které se zdály být daleko za hranicemi mých schopností studenta prvního týdne Flatironu. Podobně jako „krabice s předměty“ ve hře Mario Kart se zdálo, že drahokamy propůjčují uživateli superschopnosti.
Zatímco některé gemy, například Bundler, vyžadují instalaci pouze 1 gemu, jiné gemy mají závislosti, které vyžadují instalaci více gemů:
Pro zobrazení všech lokálně nainstalovaných gemů použijte příkaz, gem list
.
Použití drahokamů
Nyní je důležitější, jak můžeme nainstalované drahokamy používat? No, to záleží na typu drahokamu. Některé gemy, jako například Rails, jsou samostatné programy v jazyce Ruby, které můžete spustit z příkazu.
Jiné jsou samy o sobě relativně nepoužitelné, ale neuvěřitelně užitečné při použití v rámci projektu. Chcete-li gem použít ze svého kódu, je nutné jej nejprve vyžadovat v horní části souboru – require 'gem_name'
. Například Pry se rychle stal jedním z mých oblíbených gemů při práci na projektech. Můj kód i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ není téměř nikdy správný, když ho píšu poprvé, a díky Pry je ladění mnohem efektivnější a o něco méně bolestivé. V uplynulém týdnu jsme se učili o API a k dokončení projektu jsme potřebovali Pry a několik dalších drahokamů.
Pokud jsou drahokamy velmi jednoduché, pokud je potřebujete pouze ve svém počítači, stávají se o něco složitějšími, pokud chcete svůj projekt distribuovat nebo publikovat. Kdokoli jiný, kdo váš projekt spustí, bude muset mít na svém počítači nainstalovány všechny potřebné drahokamy a jejich správné verze. Naštěstí máme RubyGems a Bundler, které tento proces zjednodušují.
RubyGems je framework, který zjednodušuje sdílení gemů
Část kouzla gemů spočívá v tom, že je můžeme používat všichni, a RubyGems je správce balíčků, který to umožňuje. Poskytuje standardní formát pro distribuci gemů Ruby, spravuje instalaci gemů a server pro jejich distribuci. RubyGems byl uvolněn pro veřejnost až 14. března 2004 (Den Pí! π) Ačkoli RubyGems existuje již od verze Ruby 1.8, součástí standardní distribuce Ruby se stal až ve verzi Ruby 1.9. RubyGems je také součástí standardní distribuce Ruby. Takže pro nováčky v Ruby, jako jsem já, se RubyGems automaticky nainstaluje na váš počítač při instalaci Ruby.
Jak mohli Rubyisté kdy žít bez RubyGems?
Život byl mnohem těžší. Pokud chcete znát celý příběh, vřele doporučuji shlédnout prezentaci Andrého Arka „How does Bundler work, anyway?“ z konference RailsConf 2015. Zde je moje shrnutá verze:
Kódování načítání začalo pomocí require
, a použití require
je v podstatě stejné jako vložení kódu do souboru. V nejjednodušší podobě se jedná o metodu, která extrahuje kód z argumentového souboru.
def require(filename)
eval File.name(filename)
end
Require umožňuje uživatelům načíst libovolný lokální kód tak, že vyhledá soubor v uživatelově $LOAD_PATH. $LOAD_PATH je globální proměnná a pole absolutních cest. Pokud se adresář kódu nachází někde uvnitř $LOAD_PATH, require
jej dokáže najít.
Pokud je require
skvělá pro lokální kód, co když chcete získat kód od někoho jiného? Byl to zdlouhavý proces – museli byste kód najít, stáhnout, uložit ho někam do počítače a přidat ho někam do $LOAD_PATH.
V důsledku toho se soubor setup.rb vyvinul tak, aby tento proces usnadnil. Setup.rb (který existuje dodnes) je obecný instalátor skriptů a knihoven Ruby. Byl významným vylepšením oproti require
, protože kopíroval všechny soubory Ruby do adresáře, který již byl v $LOAD_PATH. Vývojáři jsou ze své podstaty líní a setup.rb nám ušetřil několik kroků. Setup.rb však měl své vlastní problémy. Neexistovalo žádné sledování verzí a žádný způsob odinstalace programu! Jediný definitivní způsob, jak zjistit, jakou verzi máte, bylo zapsat číslo verze při instalaci. Jak si dokážete představit, používání knihoven bylo tak trochu katastrofou.
V roce 2004 přišly na pomoc RubyGems! Nyní bylo možné cizí kód neboli gemy nainstalovat nebo odinstalovat jediným příkazem! Bylo to revoluční. RubyGems měl v rukávu ještě jeden trik – dokázal si poradit s různými verzemi softwaru a každá verze byla uložena v samostatné složce.
Bundler řeší závislosti gemů
Jakkoli se RubyGems zdál neuvěřitelný, měl jednu neodstranitelnou chybu. Pokud jste chtěli sdílet projekt, jak jste zajistili, aby nový uživatel měl všechny potřebné gemy?Při současném nastavení RubyGems, pokud vývojář spustil gem install foo
a začal v aplikaci používat nový gem, bylo třeba ostatním vývojářům v projektu říci, aby spustili gem install foo
. Některé gemy mohly fungovat pouze s určitými verzemi jiných gemů a bylo stále obtížnější koordinovat závislosti gemů a verzí.
Bohužel, přicházíme k Bundleru! Bundler existuje proto, aby vyřešil problém závislostí gemů na verzích tím, že sleduje a instaluje přesně ty gemy a verze, které jsou potřeba. Bundler pracuje prostřednictvím „souboru gemů“ jazyka Ruby, který Bundleru říká, které gemy má hledat a kde je má hledat. https://rubygems.org Je to výchozí zdroj, ale pokud existují gemy na soukromém serveru, lze tento zdroj pro tyto konkrétní gemy přepsat.
Po instalaci požadovaných drahokamů (pokud je váš počítač ještě nemá) zapíše Bundler všechny nainstalované drahokamy a jejich verze do dalšího souboru Gemfile.lock. Tento soubor zámku umožňuje nainstalovat přesně stejné verze na každý počítač, na kterém je aplikace spuštěna.
Používání nástroje Bundler je jednoduché. Nejprve je nutné jej nainstalovat, a protože Bundler je sám o sobě gem, můžeme tak učinit pomocí: gem install bundler
. S nainstalovaným Bundlerem můžete použít libovolný gem ve vlastním projektu ve dvou krocích:
- Přidejte gem do souboru Gemfile v kořenovém adresáři projektu
- Spusťte
bundle install
v terminálu
Další podrobnosti o Bundleru najdete v http://bundler.io/.
.