Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Cos’è una gemma di Ruby?

Una gemma è un pacchetto che puoi scaricare &installare. Quando richiedi una gemma installata stai aggiungendo funzionalità extra al tuo programma Ruby.

Le gemme ti permettono di:

  • Aggiungere una funzione di login alla tua applicazione Rails
  • Facilmente lavorare con servizi esterni (come le API)
  • Costruire un’applicazione web

Questi sono solo alcuni esempi. Ogni gem ha il suo obiettivo.

Perché usiamo le gemme?

  • È il modo in cui condividiamo le librerie &strumenti in Ruby
  • La struttura dei file & in formato gem rende facile capire come funzionano
  • Un file di specifiche (“.spec”) che viene fornito con ogni gem descrive le dipendenze (altre gemme richieste) in modo che il codice abbia tutto ciò di cui ha bisogno per funzionare

Grazie a RubyGems, abbiamo un ricco ecosistema di utili librerie a un solo gem install passo!

Una lista di gemme richieste per un dato progetto (non gem) può essere elencata in un file speciale chiamato “Gemfile” in modo che possano essere installate automaticamente da Bundler. Entrambi trattati più avanti in questa guida.

Quali sono alcuni esempi di gemme?

  • Rails, e tutti i suoi componenti (ActiveRecord, ActiveSupport, ecc.) sono distribuiti come gemme Ruby
  • Pry, la potente alternativa a irb
  • Nokogiri, un popolare parser XML & HTML

La maggior parte delle gemme sono puro codice Ruby.

Alcune gemme includono un’estensione Ruby C per migliorare le prestazioni.

Questa estensione è costruita automaticamente per te quando installi la gemma. In alcuni casi, potresti aver bisogno di installare manualmente del software aggiuntivo che non è gestito da RubyGems.

Ora:

Impariamo di più sulle gemme costruendo il tuo & guardando i file che costituiscono una gemma.

Come costruire una gemma Ruby

Puoi preparare i file per una nuova gemma eseguendo bundle gem <name>.

Per esempio:

bundle gem awesome_gem

Un Gem è composto dalla seguente struttura:

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

Questo file .gemspec è dove troverai tutte le informazioni sul gem.

Comprende:

  • Nome del gem
  • Sommario del gem (breve descrizione)
  • Nome dell’autore
  • Lista delle dipendenze
  • Lista dei file da includere nel gem
  • Opzionale: Indirizzo email dell’autore, URL del progetto (homepage), eseguibili, estensioni c, descrizione lunga.

La versione della gemma stessa è definita come una costante in lib/<gem_name>/version.rb.

Ecco un esempio di 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

L’array require_paths è dove Ruby cercherà i tuoi file gem quando li richiederai. Questo ti permette di mettere il tuo codice sotto lib/<gem_name>/ & e poi richiederlo con require "<gem_name>/<file_name>".

Per esempio:

Un file chiamato lib/awesome_gem/parser.rb verrebbe richiesto come require "awesome_gem/parser" da qualsiasi punto all’interno della gemma.

Tu avrai la maggior parte dei tuoi require in lib/<gem_name>.rb (l’unico file alla radice di /lib).

Questo è il file che viene caricato quando si requirela gemma!

Prossimo:

Le linee add_development_dependencydefiniscono le gemme che userai durante lo sviluppo.

Queste sono gemme come minitest, RSpec, o pry.

Mentre add_dependency definisce le gemme che usi come parte del tuo codice.

Una volta che hai cambiato la descrizione del sommario & dai valori predefiniti… sarai in grado di caricare una sessione irb con la tua gemma usando il programma bin/console che bundle gem crea per te.

Esempio:

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

Poi puoi pacchettizzare la gemma usando gem build <name>.gemspec & pubblicarla su rubygems.org usando gem push.

Che cos’è Bundler?

Durante l’apprendimento delle gemme Ruby potresti anche leggere di Bundler.

Ma cos’è esattamente Bundler?

Bundler è uno strumento per la gestione delle dipendenze.

Non se ne occupa già RubyGems?

Bene, lo fa… ma solo per le gemme stesse.

La tua normale applicazione Ruby non è costruita come una gemma, quindi non ha questa caratteristica.

Ecco perché esiste Bundler!

Comprensione dei Gemfiles

Hai visto quei file Gemfile?

Ecco dove scrivi quali gemme vuoi usare per la tua applicazione Ruby.

Queste gemme saranno caricate per te senza doverle requirefare.

Un Gemfile assomiglia a questo:

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

Bundler (e RubyGems dalla versione 2.0) può leggere questo file & installare le versioni richieste di queste gemme.

Questo è ciò che dovresti vedere quando esegui il comando 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.

Ora:

Cosa sono questi simboli (come ~>) usati quando dichiari le versioni per ogni gemma nel tuo Gemfile?

Questi ti permettono di richiedere un intervallo di versioni.

Puoi dire cose come: “Voglio che la versione sia uguale o superiore a 1.2, ma inferiore a 2.0”.

Che sarebbe come questo:

gem 'puma', '~> 1.2'

Il ~> è una scorciatoia per questo intervallo:

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"

Puoi passare un'opzione branchper usare il codice di un ramo che non è master.

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

Un'altra opzione che puoi trovare è require: false.

Cosa fa?

Dice a Bundler di non richiedere automaticamente il gem per te. Questo significa che dovrete requirerichiederla nel vostro codice quando ne avrete bisogno.

Questo è usato per gemme che hanno uno scopo limitato.

Per esempio:

Gemme che usate in uno specifico task di rake, ma che non usate nei vostri modelli di controllori Rails &. Il beneficio è che risparmiate memoria nel codice della vostra app perché caricate quella gemma solo quando ne avete bisogno.

Potete anche raggruppare le gemme per ambiente.

Questo significa che potete avere gemme che sono installate solo & caricate nello sviluppo (come capybara & pry).

Infine, bundler crea un Gemfile.lock.

Qual è la differenza?

Un Gemfile.lock viene generato automaticamente & e dice esattamente quali versioni di ogni gemma sono state installate.

Bundler installerà queste versioni in modo che quando distribuirete questa applicazione in produzione, o condividerete il vostro progetto con altri sviluppatori, tutti lavoreranno con un identico set di gemme.

Comandi utili di Gem & Bundler

Comando Descrizione
gem list Lista tutte le gemme installate. Accetta un argomento per filtrare le gemme per nome (esempio: gem list active)
gem which <name> Dà il percorso dove una gemma è installata.
gem search <name> Cerca gemme da fonti configurate (default: rubygems.org). Accetta un’espressione regolare (esempio: gem search "\Aawesome_").
gem env Mostra informazioni sul tuo ambiente gem (versione, percorsi, configurazione).
gem install <nome> -v <versione> Consente di installare una specifica versione gem (esempio: gem install sinatra -v 2.0.0).
bundle viz Genera una visualizzazione del grafico delle dipendenze per il progetto corrente.
bundle show Mostra informazioni su una particolare gemma installata tramite bundler. Deve essere all’interno di una cartella con un Gemfile.
bundle outdated Mostra una lista di gemme non aggiornate nel progetto corrente. Può usare l’opzione --groups per raggrupparle.
bundle console Esegue una sessione irb con le gemme del Gemfile del progetto corrente.

Sommario

Hai imparato su RubyGems, il sistema di pacchetti per Ruby. Hai anche imparato come è strutturata una gemma, cos’è un Gemfile, Bundler &la differenza tra il Gemfile & il Gemfile.lock.

Spero che tu abbia trovato questo utile!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.