Che cos’è una gemma di rubino?

Quando ho saputo per la prima volta delle gemme di rubino, mi sono sembrate piuttosto magiche. Eseguendo bundle install potevo in qualche modo acquisire queste gemme magiche che avrebbero fatto fare al mio codice ogni sorta di cose che sembravano ben oltre le mie capacità di studente della Settimana 1 di Flatiron. Come le “caselle degli oggetti” in Mario Kart, le gemme sembrano conferire super poteri all’utente.

Ruby Gems ti danno poteri magici!

Intendo usare il mio blog per approfondire i concetti di programmazione che attirano la mia curiosità e che non capisco completamente. Per il mio primo post, voglio sfatare la natura mistica e magica delle gemme di Ruby.

Cos’è una gemma di Ruby?

No, le gemme di Ruby non sono magiche. Sono semplicemente librerie open source che contengono codice Ruby e sono confezionate con un po’ di dati extra. L’uso di una gemma permette a un programmatore di usare il codice all’interno della gemma nel proprio programma, senza inserire esplicitamente quel codice.

Le gemme possono essere usate per tutti i tipi di scopi, e puoi esplorare diverse gemme a https://rubygems.org/. Per avere un’idea migliore di ciò che le gemme possono fare, ecco un paio di gemme popolari e le loro funzionalità:

  • Bundler – Fornisce un ambiente coerente per i progetti Ruby tracciando e installando esattamente le gemme e le versioni che sono necessarie. È la gemma numero 1 scaricata di tutti i tempi, ma più avanti parleremo di Bundler.
  • RSpec – Un framework di test che supporta il Behavior Driven Development per Ruby.
  • Devise – Devise lavora con l’autenticazione. Per qualsiasi sito web che ha bisogno di fare il login degli utenti, Devise gestisce l’accesso, l’iscrizione, la reimpostazione della password, ecc.
  • JSON – Fornisce un’API per analizzare JSON dal testo.
  • Nokogiri – Fornisce parser HTML, XML, SAX, e Reader con supporto XPath e selettore CSS.
  • Rails – Rails è una gemma! Rails fornisce il framework fullstack che permette di trasformare Ruby in applicazioni web.

Installazione di gemme

Oggi, usare le gemme è facile! Installare le gemme localmente è semplice come un singolo comando: gem install . Il comando install recupera il codice, lo scarica sul tuo computer e installa la gemma e tutte le dipendenze necessarie. Infine, costruirà la documentazione per le gemme installate.

L’installazione di bundler richiede solo l’installazione di 1 gem

Mentre alcune gemme, come Bundler, richiedono solo l’installazione di 1 gemma, altre gemme hanno dipendenze che richiedono l’installazione di più gemme:

L’installazione di Draper richiede anche l’installazione delle gemme Request Store e Active Model Serializers

Per vedere tutte le gemme installate localmente, usare il comando, gem list .

Usare le gemme

Ora, più importante, come possiamo usare le nostre gemme installate? Beh, dipende dal tipo di gemma. Alcune gemme, come Rails, sono programmi Ruby a sé stanti che si possono eseguire dal comando.

Altre sono relativamente inutili da sole, ma incredibilmente utili se usate all’interno di un progetto. Per usare una gemma dall’interno del vostro codice, è necessario richiederla prima all’inizio del file – require 'gem_name' . Per esempio, Pry è diventato rapidamente una delle mie gemme preferite quando lavoro su progetti. Il mio codice i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ non è quasi mai corretto quando lo scrivo per la prima volta, e Pry rende il debugging molto più efficiente e un po’ meno doloroso. La settimana scorsa abbiamo imparato le API e avevamo bisogno di Pry e di un paio di altre gemme per completare il progetto.

Mentre le gemme sono molto semplici se ne avete bisogno solo sul vostro computer, diventano leggermente più complicate se volete distribuire o pubblicare il vostro progetto. Chiunque altro esegua il tuo progetto avrà bisogno di avere tutte le gemme necessarie e le versioni corrette installate sul proprio computer. Fortunatamente, abbiamo RubyGems e Bundler che semplificano il processo.

RubyGems è il framework che semplifica la condivisione delle gemme

Parte della magia delle gemme è che possiamo usarle tutti, e RubyGems è il package manager che lo rende possibile. Fornisce un formato standard per distribuire le gemme di Ruby, gestisce l’installazione delle gemme e un server per distribuirle. RubyGems non è stato rilasciato al pubblico fino al 14 marzo 2004 (il giorno del Pi greco! π) Anche se RubyGems esiste da Ruby 1.8, non faceva parte della distribuzione standard di Ruby fino a Ruby 1.9. Quindi per i neofiti di Ruby, come me, RubyGems è automaticamente installato sul tuo computer quando installi Ruby.

Come hanno fatto i Rubyisti a vivere senza RubyGems?

La vita era molto più difficile. Se volete la storia completa, vi consiglio vivamente di guardare la presentazione di André Arko “How does Bundler work, anyway?” dalla RailsConf 2015. Ecco la mia versione riassunta:

Il caricamento del codice è iniziato con require , e usare require è essenzialmente lo stesso che inserire il codice nel vostro file. Nella sua forma più semplice, è un metodo che estrae codice dal file argomento.

def require(filename)
eval File.name(filename)
end

Require permette agli utenti di caricare qualsiasi codice locale, cercando il file in $LOAD_PATH dell’utente. $LOAD_PATH è una variabile globale e un array di percorsi assoluti. Finché la directory del codice si trova da qualche parte all’interno di $LOAD_PATH, require sarà in grado di trovarlo.

Mentre require è ottimo per il codice locale, cosa succede se si vuole ottenere del codice da qualcun altro? Era un processo noioso – avresti dovuto trovare il codice, scaricarlo, salvarlo da qualche parte sul tuo computer e aggiungerlo da qualche parte a $LOAD_PATH.

Di conseguenza, setup.rb si è evoluto per facilitare il processo. Setup.rb (che esiste ancora oggi) è un installatore generico per script e librerie Ruby. Era un grande miglioramento rispetto a require perché copiava tutti i file Ruby in una directory che era già presente in $LOAD_PATH. Gli sviluppatori sono intrinsecamente pigri, e setup.rb ci ha risparmiato un paio di passaggi. Tuttavia, setup.rb aveva la sua serie di problemi. Non c’era tracciamento della versione e nessun modo per disinstallare un programma! L’unico modo definitivo per sapere quale versione si aveva era quello di scrivere il numero di versione all’installazione. Come puoi immaginare, usare le librerie era un po’ un disastro.

Nel 2004, RubyGems venne in soccorso! Ora il codice di altre persone, o gemme, poteva essere installato o disinstallato con un solo comando! Era rivoluzionario. RubyGems aveva un altro asso nella manica: poteva gestire diverse versioni di software, e ogni versione era tenuta nella sua cartella separata.

Bundler risolve le dipendenze delle gemme

Per quanto RubyGems sembrasse incredibile, aveva un difetto intrinseco. Se volevi condividere un progetto, come ti assicuravi che un nuovo utente avesse tutte le gemme necessarie? Con l’attuale configurazione di RubyGems, se uno sviluppatore eseguiva gem install foo e iniziava a usare una nuova gemma nell’applicazione, agli altri sviluppatori del progetto doveva essere detto di eseguire gem install foo . Certe gemme potevano funzionare solo con certe versioni di altre gemme, e diventava sempre più difficile coordinare le dipendenze di gemme e versioni.

Allora, arriviamo a Bundler! Bundler esiste per risolvere il problema della dipendenza dalle versioni delle gemme rintracciando e installando esattamente le gemme e le versioni necessarie. Bundler lavora attraverso il “gemfile” di una gemma Ruby che dice a Bundler quali gemme cercare e dove cercarle. https://rubygems.org è la fonte predefinita, ma se le gemme esistono su un server privato, quella fonte può essere sovrascritta per quelle specifiche gemme.

Example Gemfile – Source: http://bundler.io/rationale.html

Dopo aver installato le gemme necessarie (se il tuo computer non le ha già), Bundler scriverà tutte le gemme e le versioni che ha installato in un altro file, Gemfile.lock. Questo file di blocco rende possibile installare esattamente le stesse versioni su ogni macchina che esegue l’applicazione.

Utilizzare Bundler è semplice. Per prima cosa, è necessario installarlo, e poiché Bundler è un gem stesso, possiamo farlo con: gem install bundler . Con Bundler installato, puoi usare qualsiasi gemma nel tuo progetto in 2 passi:

  1. Aggiungi la gemma a un Gemfile nella root del tuo progetto
  2. Esegui bundle install nel tuo terminale

Per ulteriori specifiche su Bundler, controlla http://bundler.io/.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.