Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Mikä on Ruby gem?

Mikä on Ruby gem?

Helmi on paketti, jonka voit ladata & asentaa. Kun tarvitset asennetun gemin, lisäät Ruby-ohjelmaasi lisätoimintoja.

Gemien avulla voit:

  • Lisätä kirjautumisominaisuuden Rails-sovellukseesi
  • Työskennellä helposti ulkoisten palveluiden kanssa (kuten API:iden kanssa)
  • Rakentaa web-sovelluksen

Tässä on vain muutamia esimerkkejä. Jokaisella gemillä on oma tavoitteensa.

Miksi käytämme gemiä?

  • Siten jaamme kirjastoja & työkaluja Rubyssä
  • Tiedostorakenteen &muodon avulla on helppo ymmärtää, miten gemit toimivat
  • Määrittely (”.spec”) tiedosto, joka tulee jokaisen gemin mukana, kuvaa riippuvuudet (muut tarvittavat gemit), jotta koodilla on kaikki mitä se tarvitsee toimiakseen

Kiitos RubyGemsin, meillä on rikas ekosysteemi hyödyllisiä kirjastoja vain yhden gem install askeleen päässä!

Luettelo gemeistä, joita tarvitaan tiettyyn (ei-gem) projektiin, voidaan listata erityisessä tiedostossa nimeltä ”Gemfile”, niin että Bundler voi asentaa ne automaattisesti. Molemmat käsitellään myöhemmin tässä oppaassa.

Mitkä ovat esimerkkejä helmistä?

  • Rails ja kaikki sen komponentit (ActiveRecord, ActiveSupport jne.) jaetaan Ruby-jalokivinä
  • Pry, tehokas vaihtoehto irb:lle
  • Nokogiri, suosittu XML & HTML-jäsennin

Useimmat jalokivet ovat pelkkää Ruby-koodia.

Haarukka jalokivistä sisältää Ruby C -laajennuksen paremman suorituskyvyn aikaansaamiseksi.

Tämä laajennus rakennetaan automaattisesti puolestasi jalokiviä asennettaessa. Joissakin tapauksissa saatat joutua asentamaan manuaalisesti lisäohjelmia, joita RubyGems ei hallinnoi.

Nyt:

Oppiaksemme lisää jalokivistä rakentamalla oman & tarkastelemalla tiedostoja, jotka muodostavat jalokiven.

Miten rakennetaan RubyGem

Voit valmistella tiedostot uutta jalokiveä varten ajamalla bundle gem <name>.

Esimerkiksi:

bundle gem awesome_gem

Helmi koostuu seuraavasta rakenteesta:

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

Tässä .gemspectiedostossa on kaikki tiedot helmestä.

Se sisältää:

  • Gemin nimi
  • Gemin tiivistelmä (lyhyt kuvaus)
  • Tekijän nimi
  • Liite riippuvuuksista
  • Luettelo jalokiviin sisällytettävistä tiedostoista
  • Vaihtoehtoinen: Kirjoittajan sähköpostiosoite, projektin URL-osoite (kotisivu), suoritettavat tiedostot, c-laajennukset, pitkä kuvaus.

Itse gem-versio määritellään vakioksi kohdassa lib/<gem_name>/version.rb.

Tässä on esimerkki 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

require_paths-joukko on se, mistä Ruby etsii gem-tiedostot, kun niitä tarvitaan. Näin voit laittaa koodisi alle lib/<gem_name>/ & ja vaatia sitä sitten require "<gem_name>/<file_name>":llä.

Esimerkiksi:

Tiedosto nimeltä lib/awesome_gem/parser.rb vaadittaisiin require "awesome_gem/parser":llä mistä tahansa gemin sisältä.

Sinulla on suurin osa vaadittavista tiedostoistasi lib/<gem_name>.rb:ssa (ainoa tiedosto /lib:n juuressa).

Se on tiedosto, joka ladataan, kun require helmi!

Jatkossa:

Riveillä add_development_dependency määritellään helmet, joita aiot käyttää kehityksen aikana.

Nämä ovat helmiohjelmia, kuten minitest, RSpec tai pry.

Kun taas add_dependencymäärittelee helmet, joita käytät osana koodia.

Kun olet muuttanut yhteenvedon & kuvauksen oletusarvoista… pystyt lataamaan irb-istunnon helmelläsi käyttämällä bin/console-ohjelmaa, jonka bundle gem luo sinulle.

Esimerkki:

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

Sitten voit paketoida gemin käyttämällä gem build <name>.gemspec & julkaista sen rubygems.org:iin käyttämällä gem push.

Mikä on Bundler?

Oppiessasi Ruby gemsistä saatat lukea myös Bundlerista.

Mutta mikä Bundler tarkalleen ottaen on?

Bundler on työkalu riippuvuuksien hallintaan.

Eikö RubyGems hoitanut tämän jo aiemmin?

Noh, hoitihan se… mutta vain itse gemien osalta.

Tavanomaista Ruby-sovellustasi ei ole rakennettu gemiksi, joten se ei saa tätä ominaisuutta.

Sentähän varten Bundler on olemassa!

Helmitiedostojen ymmärtäminen

Oletko nähnyt nuo Gemfile-tiedostot?

Siinä kirjoitat, mitä gemsejä tahdot Ruby-sovelluksessasi käyttää.

Nämä jalokivet ladataan puolestasi ilman, että sinun tarvitsee require ladata niitä.

Helmitiedosto näyttää tältä:

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

Bundler (ja RubyGems versiosta 2.0 lähtien) pystyy lukemaan tätä tiedostoa & asentamaan halutut versiot näistä jalokivistä.

Tämä pitäisi näkyä, kun suoritat komennon 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.

Nyt:

Mitä nämä symbolit (kuten ~>) ovat, joita käytetään, kun ilmoitat versiot jokaiselle gem-tiedostossasi olevalle gemille?

Näiden avulla voit pyytää versioiden vaihteluväliä.

Voit sanoa sellaisia asioita, kuten: ”Haluan version olevan yhtä suuri kuin 1 tai suurempi.2, mutta pienempi kuin 2.0”.

Joka näyttäisi tältä:

gem 'puma', '~> 1.2'

~> on lyhenne tälle vaihteluvälille:

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"

Voit välittää branch-vaihtoehdon käyttääksesi koodia haarasta, joka ei ole master.

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

Toinen vaihtoehto, jonka saatat löytää, on require: false.

Mitä se tekee?

Se käskee Bundleria olemaan vaatimatta helmiä automaattisesti puolestasi. Tämä tarkoittaa, että sinun on require täytettävä se koodissasi silloin, kun tarvitset sitä.

Tätä käytetään jalokivien kohdalla, joilla on rajoitettu soveltamisala.

Esimerkiksi:

Kalokivet, joita käytät tietyssä rake-tehtävässä, mutta joita et käytä Rails-ohjaimissasi & malleissa. Etu on se, että säästät muistia sovelluskoodissasi, koska lataat kyseisen gemin vain silloin, kun tarvitset sitä.

Voit myös ryhmitellä gemit ympäristön mukaan.

Tämä tarkoittaa, että sinulla voi olla gempejä, jotka on asennettu & ladattuna vain kehityksessä (kuten capybara & pry).

Loppujen lopuksi bundler luo Gemfile.lock.

Mitä eroa siinä on?

A Gemfile.lock luodaan automaattisesti & siinä kerrotaan tarkalleen, mitkä versiot kustakin gemistä on asennettu.

Bundler asentaa nämä versiot, joten kun otat sovelluksen käyttöön tuotantoon tai jaat projektisi muiden kehittäjien kanssa, kaikki työskentelevät identtisten gemien kanssa.

Käyttökelpoiset gemit & Bundlerin komennot

Komento Kuvaus
gem-luettelo Luetteloi kaikki asennetut gemit. Hyväksyy argumentin jalokivien suodattamiseksi nimen perusteella (esimerkki: gem list active)
gem which <nimi> Antaa polun, johon jalokivi on asennettu.
gem search <nimi> Hakee jalokiviä konfiguroiduista lähdeaineistoista (oletusarvoisesti: rubygems.org). Ottaa säännöllisen lausekkeen (esimerkki: gem search "\Aawesome_").
gem env Näyttää tietoja gem-ympäristöstäsi (versio, polut, konfiguraatio).
gem install <nimi> -v <versio> Mahdollistaa asentamaan tietyntyyppisen gem:n version (esimerkki: gem install sinatra -v 2.0.0).
bundle viz Luo visualisoinnin nykyisen projektin riippuvuusgraafista.
bundle show Näyttää tietoja tietystä bundlerin kautta asennetusta gemistä. Täytyy olla kansiossa, jossa on Gemfile.
bundle outdated Näyttää luettelon nykyisessä projektissa olevista vanhentuneista helmistä. Voi käyttää --groups-vaihtoehtoa niiden ryhmittelyyn.
bundle console Käynnistää irb-istunnon, jossa käytetään nykyisen projektin gemfilestä löytyviä jalokiviä.

Yhteenveto

Olet oppinut RubyGems:stä, Rubyn pakettijärjestelmästä. Olet myös oppinut, miten gem rakentuu, mikä on gemfile, Bundler & ero Gemfile & ja Gemfile.lock välillä.

Toivottavasti tästä oli sinulle hyötyä!

Vastaa

Sähköpostiosoitettasi ei julkaista.