När jag först hörde talas om Ruby Gems verkade de ganska magiska. Genom att köra bundle install
kunde jag på något sätt skaffa mig dessa magiska ädelstenar som skulle få min kod att göra alla möjliga saker som verkade ligga långt bortom min förmåga som Flatiron-student under vecka 1. I likhet med ”item boxes” i Mario Kart verkar ädelstenar ge användaren superkrafter.
Jag har för avsikt att använda min blogg för att fördjupa mig i programvarukoncept som väcker min nyfikenhet och som jag inte helt förstår. I mitt första blogginlägg kommer jag att avfärda den mystiska, magiska karaktären hos Ruby gems.
Vad är en Ruby Gem?
Nej, Ruby gems är inte magiska. De är helt enkelt open source-bibliotek som innehåller Ruby-kod och är förpackade med lite extra data . Genom att använda en gem kan en programmerare använda koden i gemen i sitt eget program, utan att uttryckligen infoga den koden.
Gems kan användas för alla möjliga ändamål och du kan utforska olika gems på https://rubygems.org/. För att få en bättre uppfattning om vad gems kan göra, här är några populära gems och deras funktionalitet:
- Bundler – Ger en enhetlig miljö för Ruby-projekt genom att spåra och installera exakt de gems och versioner som behövs. Det är den mest nedladdade gemen genom tiderna, men mer om Bundler senare.
- RSpec – Ett testramverk som stöder beteendestyrd utveckling för Ruby.
- Devise – Devise arbetar med autentisering. För alla webbplatser som behöver användarinloggningar hanterar Devise inloggning, registrering, återställning av lösenord etc.
- Nokogiri – Tillhandahåller HTML-, XML-, SAX- och Reader-analysatorer med stöd för XPath och CSS-selektorer.
- Rails – Rails är en pärla! Rails tillhandahåller ett komplett ramverk som gör det möjligt att omvandla Ruby till webbapplikationer.
JSON – Tillhandahåller ett API för att analysera JSON från text.
Installation av gems
I dag är det enkelt att använda gems! Att installera gems lokalt är lika enkelt som ett enda kommando: gem install
. Kommandot install hämtar koden, laddar ner den till din dator och installerar gemen och alla nödvändiga beroenden. Slutligen bygger det dokumentation för de installerade gems.
Om vissa pärlor, som Bundler, endast kräver att 1 pärla installeras, har andra pärlor beroenden som kräver installation av flera pärlor:
För att se alla lokalt installerade gems använder du kommandot, gem list
.
Användning av pärlor
Nu, viktigare, hur kan vi använda våra installerade pärlor? Tja, det beror på vilken typ av pärla det rör sig om. Vissa gems, som Rails, är fristående Ruby-program som du kan köra från kommandot.
Andra gems är relativt värdelösa på egen hand, men otroligt användbara när de används i ett projekt. För att använda en gem från din kod är det nödvändigt att kräva den först i början av filen – require 'gem_name'
. Pry har till exempel snabbt blivit en av mina favoritpärlor när jag arbetar med projekt. Min kod i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ är nästan aldrig korrekt när jag först skriver den, och Pry gör felsökningen mycket effektivare och lite mindre smärtsam. Den senaste veckan lärde vi oss om API:er och behövde Pry och ett par andra pärlor för att slutföra projektet.
Men medan pärlor är mycket okomplicerade om du bara behöver dem på din dator blir de något mer komplicerade om du vill distribuera eller publicera ditt projekt. Alla andra som kör ditt projekt måste ha alla nödvändiga gems och rätt versioner installerade på sin dator. Tack och lov har vi RubyGems och Bundler som effektiviserar processen.
RubyGems är ramverket som förenklar delning av gems
En del av magin med gems är att vi alla kan använda dem, och RubyGems är pakethanteraren som gör det möjligt. Den tillhandahåller ett standardformat för att distribuera Ruby gems, hanterar installationen av gems och en server för att distribuera dem. RubyGems släpptes inte för allmänheten förrän den 14 mars 2004 (Pi-dagen! π) Även om RubyGems har funnits sedan Ruby 1.8 var det inte en del av standarddistributionen av Ruby förrän i Ruby 1.9. Så för Ruby-nybörjare, som jag själv, installeras RubyGems automatiskt på din dator när du installerar Ruby.
Hur kunde Rubyister någonsin leva utan RubyGems?
Livet var mycket svårare. Om du vill ha hela historien rekommenderar jag starkt att du tittar på André Arkos presentation ”How does Bundler work, anyway?” från RailsConf 2015. Här är min sammanfattade version:
Laddning av kodning startade med require
, och att använda require
är i princip samma sak som att infoga koden i din fil. I sin enklaste form är det en metod som hämtar kod från argumentfilen.
def require(filename)
eval File.name(filename)
end
Require gör det möjligt för användare att ladda in vilken lokal kod som helst, genom att söka i användarens $LOAD_PATH efter filen. $LOAD_PATH är en global variabel och en array av absoluta sökvägar. Så länge kodens katalog finns någonstans inom $LOAD_PATH kommer require
att kunna hitta den.
Men require
är bra för lokal kod, men vad händer om du vill hämta kod från någon annan? Det var en omständlig process – du skulle behöva hitta koden, ladda ner den, spara den någonstans på din dator och lägga till den någonstans i $LOAD_PATH.
Som ett resultat av detta utvecklades setup.rb för att underlätta processen. Setup.rb (som fortfarande finns kvar idag) är ett generiskt installationsprogram för Ruby-skript och bibliotek. Det var en stor förbättring jämfört med require
eftersom det kopierade alla Ruby-filer till en katalog som redan fanns i $LOAD_PATH. Utvecklare är av naturliga skäl lata och setup.rb sparade oss ett par steg. Setup.rb hade dock sina egna problem. Det fanns ingen versionsspårning och inget sätt att avinstallera ett program! Det enda definitiva sättet att veta vilken version man hade var att skriva ner versionsnumret vid installationen. Som du kan föreställa dig var det lite av en katastrof att använda bibliotek.
År 2004 kom RubyGems till undsättning! Nu kunde andras kod, eller gems, installeras eller avinstalleras med ett enda kommando! Det var revolutionerande. RubyGems hade ytterligare ett trick i rockärmen – det kunde hantera olika versioner av programvara, och varje version förvarades i en egen separat mapp.
Bundler löser Gem-beroenden
Och hur otroligt RubyGems än verkade, hade det en inneboende brist. Om du ville dela ett projekt, hur säkerställde du att en ny användare hade alla nödvändiga gems?Med RubyGems nuvarande upplägg, om en utvecklare körde gem install foo
och började använda en ny gem i applikationen, skulle andra utvecklare i projektet behöva få veta att de skulle köra gem install foo
. Vissa gems kunde bara fungera med vissa versioner av andra gems, och det blev allt svårare att samordna beroenden av gems och versioner.
Ack så kommer vi till Bundler! Bundler finns till för att lösa problemet med versionsuppgifter för gems genom att spåra och installera exakt de gems och versioner som behövs. Bundler arbetar genom en Ruby-gems ”gemfile” som talar om för Bundler vilka gems han ska leta efter och var han ska leta efter dem. https://rubygems.org är standardkällan, men om gems finns på en privat server kan den källan skrivas över för dessa specifika gems.
När du har installerat de nödvändiga gems (om din dator inte redan har dem) skriver Bundler alla gems och versioner som installerats till en annan fil, Gemfile.lock. Denna låsfil gör det möjligt att installera exakt samma versioner på alla maskiner som kör programmet.
Användning av Bundler är enkelt. Först är det nödvändigt att installera det, och eftersom Bundler är en gem i sig själv kan vi göra det med: gem install bundler
. När Bundler är installerad kan du använda vilken gem som helst i ditt eget projekt i två steg:
- Lägg gemen till en Gemfile i i ditt projekts rot
- Kör
bundle install
i din terminal
För mer Bundler-specifika detaljer, kolla in http://bundler.io/.