Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Mi az a Ruby gem?

A gem egy csomag, amelyet letölthet & telepíthet. Amikor egy telepített gem-et igényelsz, akkor extra funkcionalitást adsz a Ruby programodhoz.

A gem-ek lehetővé teszik:

  • Login funkciót adhatsz a Rails alkalmazásodhoz
  • Egyszerűen dolgozhatsz külső szolgáltatásokkal (például API-kkal)
  • Webalkalmazást építhetsz

Ez csak néhány példa. Minden gemnek megvan a maga célja.

Miért használunk gemeket?

  • Ezzel osztjuk meg a könyvtárakat & eszközökkel a Ruby-ban
  • A gemek fájlszerkezete &formátuma megkönnyíti a működésük megértését
  • A specifikáció (“.spec”) fájl, amely minden gem-hez tartozik, leírja a függőségeket (más szükséges gem-eket), így a kódnak mindene megvan ahhoz, hogy működjön

A RubyGems-nek köszönhetően hasznos könyvtárak gazdag ökoszisztémája áll rendelkezésünkre egyetlen gem install lépésre!

Az adott (nem gem) projekthez szükséges gem-ek listáját egy speciális “Gemfile” nevű fájlban lehet felsorolni, hogy a Bundler automatikusan telepítse őket. Mindkettővel később foglalkozunk ebben az útmutatóban.

Milyen példák vannak a gemekre?

  • A Rails, és annak minden komponense (ActiveRecord, ActiveSupport, stb.) Ruby gemként kerülnek terjesztésre
  • Pry, az irb hatékony alternatívája
  • Nokogiri, egy népszerű XML & HTML elemző

A legtöbb gem tiszta Ruby kód.

Néhány gem tartalmaz egy Ruby C kiterjesztést a jobb teljesítmény érdekében.

Ezt a kiterjesztést a gem telepítésekor automatikusan elkészíti az Ön számára. Bizonyos esetekben előfordulhat, hogy kézzel kell telepítened további szoftvereket, amelyeket nem a RubyGems kezel.

Most:

Tanuljunk többet a gemekről azzal, hogy elkészítjük a saját &unkat, megnézzük, milyen fájlok alkotnak egy gemet.

How to Build a RubyGem

Egy új gem fájljait a bundle gem <name> futtatásával készítheted elő.

Egy gem például:

bundle gem awesome_gem

Egy gem a következő struktúrából áll:

├── 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

Ez a .gemspecfájl tartalmazza az összes információt a gemről.

Ez tartalmazza:

  • Gem neve
  • Gem összefoglaló (rövid leírás)
  • A szerző neve
  • Függőségi lista
  • A gembe bevonandó fájlok listája
  • Választható:

A gem verziója maga a lib/<gem_name>/version.rb konstansként van definiálva.

Itt egy példa 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

A require_paths tömbben a Ruby megkeresi a gem fájlokat, ha szükség van rájuk. Ez lehetővé teszi, hogy a kódodat a lib/<gem_name>/ & alá helyezd, majd a require "<gem_name>/<file_name>"-vel követeld meg.

Például:

A lib/awesome_gem/parser.rb nevű fájlt a gemen belül bárhonnan require "awesome_gem/parser"-ként követelnéd meg.

A legtöbb követelményed a lib/<gem_name>.rb-ban lesz (az egyetlen fájl a /lib gyökerében).

Ez az a fájl, ami betöltődik, amikor require a gemet!

Következő:

A add_development_dependency sorok olyan gemeket definiálnak, amelyeket a fejlesztés során fogsz használni.

Ezek olyan gemek, mint a minitest, RSpec vagy pry.

Míg a add_dependency olyan gemeket definiál, amelyeket a kódod részeként használsz.

Mihelyt megváltoztattad az összefoglaló & leírást az alapértelmezett értékekről… képes leszel betölteni egy irb munkamenetet a gemeddel a bin/console program segítségével, amit bundle gem hoz létre neked.

Példa:

$ 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"

Ezt követően csomagolhatod a gemet a gem build <name>.gemspec & segítségével és közzéteheted a rubygems.org-on a gem push segítségével.

Mi a Bundler?

A Ruby gems megismerése közben olvashatsz a Bundlerről is.

De mi is az a Bundler pontosan?

A Bundler egy függőségkezelő eszköz.

A RubyGems ezt nem kezeli már?

Nos, igen… de csak magukra a gemekre vonatkozóan.

A normál Ruby alkalmazásod nem gemként épül, így nem kapja meg ezt a funkciót.

Ezért létezik a Bundler!

A gemfilek megértése

Láttad már azokat a Gemfile fájlokat?

Ezekbe írod be, hogy milyen gemeket szeretnél használni a Ruby alkalmazásodban.

Ezek a gemek betöltődnek helyetted, anélkül, hogy neked require kellene őket

Egy Gemfile így néz ki:

ruby '2.5.0'gem 'rails', '~> 5.2.1'gem 'sqlite3'gem 'puma', '~> 3.11'gem 'bootsnap', '>= 1.1.0', require: false

Bundler (és a RubyGems a 2.0-s verzió óta) képes olvasni ezt a fájlt & telepíteni ezeknek a gemeknek a kért verzióit.

Ezt kell látnod, amikor a bundle install parancsot futtatod:

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.

Most:

Mit jelentenek ezek a szimbólumok (mint a ~>), amelyeket a Gemfile-odban lévő összes gem verziójának deklarálásakor használsz?

Ezekkel a verziók egy tartományát kérheted.

Mondhatsz olyan dolgokat, mint például: “Azt akarom, hogy a verzió egyenlő vagy nagyobb legyen, mint 1.”.2, de kisebb, mint 2.0″.

Az így nézne ki:

gem 'puma', '~> 1.2'

A ~> egy rövidítés erre a tartományra:

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"

Adhatsz át egy branch opciót, hogy olyan ágból származó kódot használj, amely nem master.

gem "awesome_print", git: "[email protected]:awesome-print/awesome_print.git", branch: "v2"

Egy másik opció, amit megtalálhatsz, a require: false.

Mit csinál ez?

Ez azt mondja a Bundlernek, hogy ne kérje automatikusan a gem-et helyetted. Ez azt jelenti, hogy neked kell require beillesztened a kódodba, amikor szükséged van rá.

Ezt olyan gemeknél használjuk, amelyek korlátozott hatókörűek.

Például:

Gemek, amelyeket egy adott rake feladatban használsz, de nem használod a Rails vezérlő & modelljeidben. Ennek előnye, hogy memóriát takarítasz meg az alkalmazásod kódjában, mert csak akkor töltöd be az adott gemet, amikor szükséged van rá.

A gemeket környezet szerint is csoportosíthatod.

Ez azt jelenti, hogy lehetnek olyan gemek, amelyeket csak & a fejlesztés során telepítesz (például capybara & pry).

A bundler végül létrehoz egy Gemfile.lock-et.

Mi a különbség?

A Gemfile.lock automatikusan generálódik & ez pontosan megmondja, hogy az egyes gem-ek mely verziói lettek telepítve.

A Bundler telepíti ezeket a verziókat, így amikor ezt az alkalmazást telepíti a termelésbe, vagy megosztja a projektjét más fejlesztőkkel, mindenki azonos gemkészlettel fog dolgozni.

Hasznos gem & Bundler-parancsok

Parancs leírás
gem list Listázza az összes telepített gem-et. Elfogad egy argumentumot a drágakövek név szerinti szűréséhez (példa: gem list active)
gem which <név> Megadja az elérési utat, ahová egy drágakő telepítve van.
gem search <név> Keres drágaköveket a beállított forrásokból (alapértelmezett: rubygems.org). Elfogad egy reguláris kifejezést (példa: gem search "\Aawesome_").
gem env Megjeleníti a gem környezetre vonatkozó információkat (verzió, elérési utak, konfiguráció).
gem install <name> -v <version> Megengedi egy adott gem verzió telepítését (példa: gem install sinatra -v 2.0.0).
bundle viz Elkészíti az aktuális projekt függőségi gráfjának vizualizációját.
bundle show Megjeleníti a bundler segítségével telepített adott gemről szóló információkat. Gemfillel rendelkező mappán belül kell lennie.
bundle outdated Megjeleníti az aktuális projektben lévő elavult gemek listáját. Használhatja a --groups opciót a csoportosításukhoz.
bundle console Futtat egy irb munkamenetet az aktuális projekt Gemfile-jában lévő drágakövekkel.

Összefoglalás

Megtanultad a RubyGems-t, a Ruby csomagrendszerét. Azt is megtudtad, hogyan épül fel egy gem, mi az a Gemfile, Bundler & a különbség a Gemfile & a Gemfile.lock között.

Remélem, hasznosnak találtad!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.