Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

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 installna 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 requirezadá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 requireve 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é!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.