Da jeg først hørte om rubinædelsten, virkede de ret magiske. Ved at køre bundle install
kunne jeg på en eller anden måde erhverve disse magiske ædelstene, som ville få min kode til at gøre alle mulige ting, som virkede langt ud over mine evner som uge 1 Flatiron-studerende. I lighed med “item boxes” i Mario Kart synes perler at give brugeren superkræfter.
Jeg har til hensigt at bruge min blog til at dykke dybere ned i programmeringsbegreber, der pirrer min nysgerrighed, og som jeg ikke helt forstår. I mit første blogindlæg vil jeg aflive den mystiske, magiske karakter af Ruby gems.
Hvad er en Ruby Gem?
Nej, Ruby gems er ikke magiske. De er simpelthen open source-biblioteker, der indeholder Ruby-kode og er pakket med lidt ekstra data . Ved at bruge en gem kan en programmør bruge koden i gem’en i sit eget program uden eksplicit at indsætte denne kode.
Gems kan bruges til alle mulige formål, og du kan udforske forskellige gem’er på https://rubygems.org/. For at få et bedre indtryk af, hvad gems kan gøre, er her et par populære gems og deres funktionalitet:
- Bundler – Giver et konsistent miljø for Ruby-projekter ved at spore og installere præcis de gems og versioner, der er nødvendige. Det er den mest downloadede perle nogensinde, men mere om Bundler senere.
- RSpec – En testramme, der understøtter Behavior Driven Development for Ruby.
- Devise – Devise arbejder med autentificering. For ethvert websted, der har brug for brugerlogins, håndterer Devise sign in, sign up, reset password osv..
- JSON – Tilbyder et API til parsing af JSON fra tekst.
- Nokogiri – Tilbyder HTML-, XML-, SAX- og Reader-parsere med XPath- og CSS-selektorunderstøttelse.
- Rails – Rails er en perle! Rails leverer den fullstack-ramme, der gør det muligt at omdanne Ruby til webapplikationer.
Installation af gems
I dag er det nemt at bruge gems! Installation af gems lokalt er lige så enkelt som en enkelt kommando: gem install
. Kommandoen install henter koden, downloader den til din computer og installerer perlen og eventuelle nødvendige afhængigheder. Endelig opbygger den dokumentation for de installerede gems.
Mens nogle perler, som Bundler, kun kræver installation af 1 perle, har andre perler afhængigheder, der kræver installation af flere perler:
For at se alle lokalt installerede perler skal du bruge kommandoen, gem list
.
Brug af perler
Nu er det endnu vigtigere, hvordan kan vi bruge vores installerede perler? Tja, det afhænger af typen af perle. Nogle gems, som Rails, er selvstændige Ruby-programmer, som du kan køre fra kommandoen.
Andre er relativt ubrugelige i sig selv, men utroligt nyttige, når de bruges i et projekt. Hvis du vil bruge en gem fra din kode, er det nødvendigt at kræve den først i toppen af filen – require 'gem_name'
. Pry er f.eks. hurtigt blevet en af mine favorit-perler, når jeg arbejder på projekter. Min kode i̶s̶n̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ er næsten aldrig korrekt, når jeg først skriver den, og Pry gør debugging langt mere effektiv og lidt mindre smertefuld. I sidste uge lærte vi om API’er og havde brug for Pry og et par andre gems for at færdiggøre projektet.
Mens gems er meget ligetil, hvis du kun har brug for dem på din computer, bliver de lidt mere komplicerede, hvis du vil distribuere eller udgive dit projekt. Alle andre, der kører dit projekt, skal have alle de nødvendige gems og de korrekte versioner installeret på deres computer. Heldigvis har vi RubyGems og Bundler, som strømliner processen.
RubyGems er rammen, der forenkler deling af gems
En del af magien ved gems er, at vi alle kan bruge dem, og RubyGems er den pakkehåndtering, der gør det muligt. Det giver et standardformat til distribution af Ruby-perler, administrerer installationen af perler og en server til at distribuere dem. RubyGems blev ikke frigivet til offentligheden før den 14. marts 2004 (Pi-dag! π) Selv om RubyGems har eksisteret siden Ruby 1.8, var det ikke en del af standard-Rubydistributionen før Ruby 1.9. Så for Ruby-nybegyndere, som mig selv, er RubyGems automatisk installeret på din computer, når du installerer Ruby.
Hvordan har Rubyister nogensinde levet uden RubyGems?
Livet var meget sværere. Hvis du vil have hele historien, kan jeg varmt anbefale at se André Arko’s præsentation “How does Bundler work, anyway?” fra RailsConf 2015. Her er min sammenfattede version:
Indlæsning af kodning startede med require
, og at bruge require
er stort set det samme som at indsætte koden i din fil. I sin enkleste form er det en metode, der udtrækker kode fra argumentfilen.
def require(filename)
eval File.name(filename)
end
Require giver brugerne mulighed for at indlæse enhver lokal kode, ved at søge i brugerens $LOAD_PATH efter filen. $LOAD_PATH er en global variabel og et array af absolutte stier. Så længe kodens mappe er placeret et sted inden for $LOAD_PATH, vil require
kunne finde den.
Mens require
er fantastisk til lokal kode, hvad så, hvis du ønsker at hente kode fra en anden? Det var en kedelig proces – du skulle finde koden, downloade den, gemme den et sted på din computer og tilføje den et sted til $LOAD_PATH.
Som et resultat heraf blev setup.rb udviklet for at lette processen. Setup.rb (som stadig findes i dag) er et generisk installationsprogram for Ruby-scripts og biblioteker. Det var en stor forbedring i forhold til require
, fordi det kopierede alle Ruby-filerne til en mappe, der allerede var i $LOAD_PATH. Udviklere er i sagens natur dovne, og setup.rb sparede os for et par trin. Setup.rb havde dog sit eget sæt problemer. Der var ingen versionssporing og ingen mulighed for at afinstallere et program! Den eneste endegyldige måde at vide, hvilken version man havde, var at skrive versionsnummeret ned ved installationen. Som du kan forestille dig, var det lidt af en katastrofe at bruge biblioteker.
I 2004 kom RubyGems til undsætning! Nu kunne andres kode, eller gems, installeres eller afinstalleres med en enkelt kommando! Det var revolutionerende. RubyGems havde endnu et trick i ærmet – det kunne håndtere forskellige versioner af software, og hver version blev opbevaret i sin egen separate mappe.
Bundler løser Gem-afhængigheder
Så utroligt som RubyGems virkede, havde det én iboende fejl. Hvis man ønskede at dele et projekt, hvordan sikrede man så, at en ny bruger havde alle de nødvendige gems?Med RubyGems’ nuværende opsætning, hvis en udvikler kørte gem install foo
og begyndte at bruge en ny gem i applikationen, skulle de andre udviklere på projektet have besked om at køre gem install foo
. Visse gems kunne kun fungere sammen med bestemte versioner af andre gems, og det blev stadig vanskeligere at koordinere afhængigheder af gems og versioner.
Alas, vi er nået frem til Bundler! Bundler findes for at løse problemet med afhængighed af gem-versioner ved at spore og installere præcis de gems og versioner, der er nødvendige. Bundler arbejder gennem en Ruby-gems “gemfile”, som fortæller Bundler, hvilke gems Bundler skal lede efter og hvor de skal lede efter dem. https://rubygems.org er standardkilden, men hvis der findes perler på en privat server, kan denne kilde overskrives for de specifikke perler.
Når du har installeret de nødvendige perler (hvis din computer ikke allerede har dem), skriver Bundler alle de perler og versioner, som den har installeret, til en anden fil, Gemfile.lock. Denne lock-fil gør det muligt at installere nøjagtig de samme versioner på alle maskiner, der kører programmet.
Det er nemt at bruge Bundler. Først er det nødvendigt at installere det, og da Bundler selv er en gem, kan vi gøre det med : gem install bundler
. Når Bundler er installeret, kan du bruge enhver gem i dit eget projekt i 2 trin:
- Føj gem’en til en Gemfile i i i dit projekts rod
- Kør
bundle install
i din terminal
For flere Bundler-specifikke oplysninger kan du læse http://bundler.io/.