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 .gemspec
fá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!