Co je to Ruby gem?
Gem je balíček, který můžete stáhnout & nainstalovat. Pokud vyžadujete nainstalovaný gem, přidáváte do svého programu v jazyce Ruby další funkce.
Gemy vám umožňují:
- Přidat do své aplikace Rails funkci přihlašování
- Snadno pracovat s externími službami (například API)
- Vytvořit webovou aplikaci
To je jen několik příkladů. Každý gem má svůj vlastní cíl.
Proč používáme gemy?
- Je to způsob, jak sdílet knihovny & nástroje v Ruby
- Struktura souborů &formát gemů usnadňuje pochopení jejich fungování
- Specifikace („.spec“), který je dodáván s každým gemem, popisuje závislosti (další potřebné gemy), takže kód má vše, co potřebuje ke svému fungování
Díky RubyGems máme bohatý ekosystém užitečných knihoven jen gem install
na dosah ruky!
Seznam gemů potřebných pro daný (ne-gemový) projekt lze uvést ve speciálním souboru nazvaném „Gemfile“, takže je Bundler může automaticky nainstalovat. Obojím se zabýváme později v této příručce.
Jaké jsou příklady gemů?
- Rails a všechny jeho součásti (ActiveRecord, ActiveSupport atd.) jsou distribuovány jako drahokamy Ruby
- Pry, výkonná alternativa k irb
- Nokogiri, populární parser XML & HTML
Většina drahokamů je čistý kód Ruby.
Několik drahokamů obsahuje rozšíření Ruby C pro zvýšení výkonu.
Toto rozšíření je pro vás automaticky sestaveno při instalaci drahokamu. V některých případech může být nutné ručně nainstalovat další software, který není spravován systémem RubyGems.
Nyní:
Zjistíme více o gemech sestavením vlastního &podíváme se na soubory, které tvoří gem.
Jak sestavit gem Ruby
Soubory pro nový gem můžete připravit spuštěním bundle gem <name>
.
Například:
bundle gem awesome_gem
Gem se skládá z následující struktury:
├── awesome_gem.gemspec├── bin│ ├── console│ └── setup├── Gemfile├── lib│ ├── awesome_gem│ │ └── version.rb│ └── awesome_gem.rb├── Rakefile├── README.md└── test ├── awesome_gem_test.rb └── test_helper.rb
V tomto souboru .gemspec
najdete všechny informace o gemu.
Obsahuje:
- Název gemu
- Shrnutí gemu (krátký popis)
- Jméno autora
- Seznam závislostí
- Seznam souborů, které má gem obsahovat
- Volitelné:
Samotná verze gemu je definována jako konstanta lib/<gem_name>/version.rb
.
Tady je příklad gemspec:
Gem::Specification.new do |spec| spec.name = "awesome_gem" spec.version = AwesomeGem::VERSION spec.authors = spec.summary = "Example gem for article about Ruby gems" spec.files = Dir.grep_v(/.gem$/) spec.require_paths = spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0"end
Pole require_paths
je místo, kde bude Ruby hledat soubory gemu, když je budete vyžadovat. To vám umožní umístit váš kód pod lib/<gem_name>/
& a pak ho vyžadovat pomocí require "<gem_name>/<file_name>"
.
Například:
Soubor s názvem lib/awesome_gem/parser.rb
bude vyžadován jako require "awesome_gem/parser"
odkudkoli uvnitř gemu.
Většinu svých požadavků budete mít v lib/<gem_name>.rb
(jediný soubor v kořeni /lib
).
To je soubor, který se načte, když require
gem
Další:
Řádky add_development_dependency
definují gemy, které budete používat při vývoji.
Jsou to gemy jako minitest, RSpec nebo pry.
Proti tomu add_dependency
definuje gemy, které používáte jako součást svého kódu.
Jakmile změníte souhrnný popis & z výchozích hodnot… budete moci načíst relaci irb s vaším gemem pomocí programu bin/console
, který pro vás vytvoří bundle gem
.
Příklad:
$ bin/consoleirb(main):001:0>irb(main):002:0>irb(main):003:0> AwesomeGem=> AwesomeGemirb(main):004:0>irb(main):005:0> AwesomeGem::VERSION=> "0.1.0"
Poté můžete gem zabalit pomocí gem build <name>.gemspec
& zveřejnit na rubygems.org pomocí gem push
.
Co je Bundler?
Při učení o gemech Ruby se možná dočtete také o Bundleru.
Ale co to vlastně Bundler je?
Bundler je nástroj pro správu závislostí.
Nezvládá to už RubyGems?
No, zvládá… ale jen pro gemy samotné.
Vaše běžná aplikace Ruby není sestavena jako gem, takže tuto funkci nemá.
Proto existuje Bundler!
Pochopení Gemfiles
Viděli jste ty Gemfile
soubory?
Tam se zapisuje, jaké gemy chcete pro svou aplikaci Ruby použít.
Tyto drahokamy se načtou za vás, aniž byste je museli require
zadávat.
Soubor Gemfile vypadá takto:
ruby '2.5.0'gem 'rails', '~> 5.2.1'gem 'sqlite3'gem 'puma', '~> 3.11'gem 'bootsnap', '>= 1.1.0', require: false
Bundler (a RubyGems od verze 2.0) umí tento soubor přečíst &nainstalovat požadované verze těchto drahokamů.
Toto by se mělo zobrazit při spuštění příkazu bundle install
:
Using turbolinks-source 5.1.0Using turbolinks 5.1.1Using uglifier 4.1.18Using web-console 3.6.2Bundle complete! 18 Gemfile dependencies, 78 gems now installed.Use `bundle info ` to see where a bundled gem is installed.
Nyní:
Jaké jsou tyto symboly (jako ~>
), které se používají při deklarování verzí pro každý gem v souboru Gemfile?
Ty umožňují požadovat rozsah verzí.
Můžete říci věci jako: „Chci, aby verze byla rovna nebo větší než 1″.2, ale menší než 2.0“.
Což by vypadalo takto:
gem 'puma', '~> 1.2'
Příkaz ~>
je zkratka pro tento rozsah:
gem 'puma', '>= 1.2', 'In the case of , it means exactly this:
'>= 5.2.1', 'The more specific the version number is the more restricted the version range will be.
Gemfile Options & Gemfile.lock
You have a few options when requiring a gem inside a Gemfile.
For example:
You may want to pull a gem from a different source, like GitHub.
This is helpful when you need to use the latest version of the project, even if it hasn't been released on rubygems.org yet.
Here's an example:
gem "rails", git: "[email protected]:rails/rails.git"Můžete předat volbu
branch
pro použití kódu z větve, která není master.gem "awesome_print", git: "[email protected]:awesome-print/awesome_print.git", branch: "v2"Další volba, kterou můžete najít, je
require: false
.Co to dělá?
Řekne Bundleru, aby za vás gem automaticky nevyžadoval. To znamená, že jej budete muset
require
ve svém kódu doplnit, až jej budete potřebovat.Tato funkce se používá u gemů, které mají omezený rozsah.
Například:
Gemy, které používáte v konkrétní úloze rake, ale nepoužíváte je ve svých modelech řadičů Rails &. Výhodou je, že ušetříte paměť v kódu aplikace, protože daný gem načtete pouze tehdy, když ho potřebujete.
Gemy můžete také seskupovat podle prostředí.
To znamená, že můžete mít gemy, které jsou nainstalované & načtené pouze při vývoji (například
capybara
&pry
).Nakonec bundler vytvoří
Gemfile.lock
.Jaký je v tom rozdíl?
A
Gemfile.lock
je automaticky generovaný &, je v něm přesně uvedeno, jaké verze každého gemu byly nainstalovány.Bundler tyto verze nainstaluje, takže při nasazení této aplikace do výroby nebo při sdílení projektu s jinými vývojáři budou všichni pracovat s identickou sadou gemů.
Příkazy nástroje Bundler &
Příkaz | Popis |
---|---|
výpis gemů | Seznam všech nainstalovaných gemů. Přijímá argument pro filtrování gemů podle jména (příklad: gem list active ) |
gem which <name> | Podává cestu, kde je gem nainstalován. |
gem search <name> | Vyhledávání gemů z nakonfigurovaných zdrojů (výchozí: rubygems.org). Přijímá regulární výraz (příklad: gem search "\Aawesome_" ). |
gem env | Zobrazí informace o prostředí gemů (verze, cesty, konfigurace). |
gem install <name> -v <version> | Umožňuje nainstalovat konkrétní verzi gemů (příklad: gem install sinatra -v 2.0.0 ). |
bundle viz | Vytvoří vizualizaci grafu závislostí pro váš aktuální projekt. |
bundle show | Zobrazí informace o konkrétním gemu nainstalovaném prostřednictvím nástroje bundler. Musí být uvnitř složky s Gemfile. |
bundle outdated | Zobrazí seznam zastaralých gemů v aktuálním projektu. Může použít volbu --groups pro jejich seskupení. |
bundle console | Spustí relaci irb s drahokamy ze souboru Gemfile aktuálního projektu. |
Shrnutí
Poznali jste RubyGems, balíčkovací systém pro Ruby. Dozvěděli jste se také, jak je gem strukturován, co je to Gemfile, Bundler & rozdíl mezi Gemfile
& a Gemfile.lock
.
Doufám, že vám to bylo užitečné!