Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Ce este o gemă Ruby?

O gemă este un pachet pe care îl puteți descărca & instala. Când aveți nevoie de o gemă instalată, adăugați o funcționalitate suplimentară programului dvs. Ruby.

Gemele vă permit să:

  • Adaugați o funcție de logare la aplicația dvs. Rails
  • Lucrați cu ușurință cu servicii externe (cum ar fi API-urile)
  • Construiți o aplicație web

Acestea sunt doar câteva exemple. Fiecare gem are propriul său scop.

De ce folosim gemuri?

  • Este modul în care partajăm biblioteci & instrumente în Ruby
  • Formatul structurii de fișier & al unui gem face ușor de înțeles cum funcționează
  • O specificație („.spec”) care însoțește fiecare gem descrie dependențele (alte gem-uri necesare) astfel încât codul să aibă tot ce are nevoie pentru a funcționa

Grație RubyGems, avem un ecosistem bogat de biblioteci utile la doar o gem install distanță!

O listă de gem-uri necesare pentru un anumit proiect (non-gem) poate fi listată într-un fișier special numit „Gemfile” astfel încât acestea să poată fi instalate automat de Bundler. Ambele sunt abordate mai târziu în acest ghid.

Care sunt câteva exemple de pietre prețioase?

  • Rails, și toate componentele sale (ActiveRecord, ActiveSupport, etc.) sunt distribuite ca pietre prețioase Ruby
  • Pry, alternativa puternică la irb
  • Nokogiri, un popular analizor XML & HTML

Majoritatea pietrelor prețioase sunt cod Ruby pur.

Câteva pietre prețioase includ o extensie Ruby C pentru îmbunătățirea performanțelor.

Această extensie este construită automat pentru dumneavoastră atunci când instalați piatra prețioasă. În unele cazuri, este posibil să fie nevoie să instalați manual un software suplimentar care nu este gestionat de RubyGems.

Acum:

Să învățăm mai multe despre gemuri construind propriul & analizând fișierele care alcătuiesc o gemă.

Cum se construiește o gemă RubyGem

Puteți pregăti fișierele pentru o nouă gemă rulând bundle gem <name>.

De exemplu:

bundle gem awesome_gem

Un gem este compus din următoarea structură:

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

Acest fișier .gemspec este cel în care veți găsi toate informațiile despre gem.

Acesta include:

  • Numele gemei
  • Rezumat al gemei (scurtă descriere)
  • Numele autorului
  • Lista de dependențe
  • Lista de fișiere care trebuie incluse în gemă
  • Opțional: Adresa de e-mail a autorului, URL-ul proiectului (pagina de pornire), executabile, extensii c, descriere lungă.

Versiunea gemului în sine este definită ca o constantă în lib/<gem_name>/version.rb.

Iată un exemplu de 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

Array-ul require_paths este locul în care Ruby va căuta fișierele gemului dvs. atunci când aveți nevoie de ele. Acest lucru vă permite să vă puneți codul sub lib/<gem_name>/ & și apoi să îl cereți cu require "<gem_name>/<file_name>".

De exemplu:

Un fișier numit lib/awesome_gem/parser.rb ar fi cerut ca require "awesome_gem/parser" de oriunde din interiorul gemului.

Vă veți avea majoritatea cerințelor în lib/<gem_name>.rb (singurul fișier de la rădăcina lui /lib).

Acesta este fișierul care se încarcă atunci când require gemul!

În continuare:

Liniile add_development_dependency definesc gemurile pe care le veți folosi în timpul dezvoltării.

Acestea sunt gemuri precum minitest, RSpec sau pry.

În timp ce add_dependency definește gemurile pe care le folosiți ca parte a codului dvs.

După ce ați schimbat descrierea sumarului & de la valorile implicite… veți putea încărca o sesiune irb cu gemul dvs. folosind programulbin/consolepe carebundle gemîl creează pentru dvs.

Exemplu:

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

Apoi puteți împacheta gemul folosind gem build <name>.gemspec & îl puteți publica pe rubygems.org folosind gem push.

Ce este Bundler?

În timp ce învățați despre gemele Ruby este posibil să citiți și despre Bundler.

Dar ce este Bundler mai exact?

Bundler este o unealtă pentru gestionarea dependențelor.

Nu se ocupa deja RubyGems de acest lucru?

Bine, o face… dar numai pentru gemele în sine.

Aplicația Ruby obișnuită nu este construită ca o gemă, deci nu beneficiază de această caracteristică.

De aceea există Bundler!

Înțelegerea fișierelor Gemfiles

Ai văzut acele fișiere Gemfile?

Acestea sunt cele în care scrieți ce gemuri doriți să folosiți pentru aplicația Ruby.

Aceste pietre prețioase vor fi încărcate pentru dvs. fără a fi nevoie să le require.

Un Gemfile arată astfel:

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

Bundler (și RubyGems începând cu versiunea 2.0) poate citi acest fișier & și instala versiunile solicitate ale acestor pietre prețioase.

Aceasta este ceea ce ar trebui să vedeți atunci când executați comanda 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.

Acum:

Ce sunt aceste simboluri (precum ~>) folosite atunci când declarați versiunile pentru fiecare gem din fișierul Gemfile?

Acestea vă permit să solicitați un interval de versiuni.

Puteți spune lucruri precum: „Vreau ca versiunea să fie egală sau mai mare decât 1.”.2, dar mai mică decât 2.0″.

Ceea ce ar arăta astfel:

gem 'puma', '~> 1.2'

Legătura ~> este o prescurtare pentru acest interval:

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"

Puteți trece o opțiune branchpentru a utiliza codul dintr-o ramură care nu este master.

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

O altă opțiune pe care o puteți găsi este require: false.

Ce face aceasta?

Îi spune lui Bundler să nu solicite automat gemul pentru dumneavoastră. Acest lucru înseamnă că va trebui să o require în codul dvs. atunci când aveți nevoie de ea.

Acest lucru este folosit pentru gemele care au un domeniu de aplicare limitat.

De exemplu:

Gemele pe care le folosiți într-o anumită sarcină rake, dar pe care nu le folosiți în modelele dvs. de controlori Rails &. Beneficiul este că economisiți memorie în codul aplicației dvs. pentru că încărcați acea gemă doar atunci când aveți nevoie de ea.

De asemenea, puteți grupa gemele în funcție de mediu.

Aceasta înseamnă că puteți avea geme care sunt instalate & încărcate doar în dezvoltare (cum ar fi capybara & & pry).

În cele din urmă, bundler creează un Gemfile.lock.

Care este diferența?

Un Gemfile.lock este generat automat & acesta spune exact ce versiuni ale fiecărei pietre prețioase au fost instalate.

Bundler va instala aceste versiuni, astfel încât atunci când implementați această aplicație în producție sau când partajați proiectul dvs. cu alți dezvoltatori, toată lumea va lucra cu un set identic de pietre prețioase.

Comenzi utile ale gemelor &Comandă Bundler

Comandă Descriere
Lista gemelor Lista tuturor gemelor instalate. Acceptă un argument pentru filtrarea gemelor după nume (exemplu: gem list active)
gem which <name> Vă oferă calea unde este instalată o gemă.
gem search <name> Cercetați gemele din sursele configurate (implicit: rubygems.org). Acceptă o expresie regulată (exemplu: gem search "\Aawesome_").
gem env Afișează informații despre mediul gem (versiune, căi, configurare).
gem install <name> -v <version> Permite instalarea unei anumite versiuni de gem (exemplu: gem install sinatra -v 2.0.0).
bundle viz Generează o vizualizare a graficului de dependențe pentru proiectul dvs. curent.
bundle show Afișează informații despre o anumită gemă instalată prin bundler. Trebuie să se afle în interiorul unui dosar cu un Gemfile.
bundle outdated Afișează o listă a gemelor învechite din proiectul curent. Poate folosi opțiunea --groups pentru a le grupa.
bundle console Execută o sesiune irb cu gemele din fișierul Gemfile al proiectului curent.

Summary

Ați învățat despre RubyGems, sistemul de pachete pentru Ruby. Ați învățat, de asemenea, cum este structurat un gem, ce este un Gemfile, Bundler & diferența dintre Gemfile & și Gemfile.lock.

Sper că v-a fost de folos!

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.