Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Vad är en Ruby gem?

En gem är ett paket som du kan ladda ner & och installera. När du kräver en installerad gem lägger du till extra funktionalitet till ditt Ruby-program.

Gems gör det möjligt för dig att:

  • Lägga till en inloggningsfunktion till din Rails-app
  • Förmildt arbeta med externa tjänster (som API:er)
  • Bygga en webbapplikation

Det är bara några exempel. Varje gem har sitt eget mål.

Varför använder vi gems?

  • Det är så vi delar bibliotek & verktyg i Ruby
  • Filstruktur &formatet för en gem gör det lätt att förstå hur de fungerar
  • En specifikation (”.spec”) som följer med varje gem beskriver beroenden (andra nödvändiga gems) så att koden har allt den behöver för att fungera

Tack vare RubyGems har vi ett rikt ekosystem av hjälpsamma bibliotek som bara är gem install en gem install bit bort!

En lista över de gems som krävs för ett visst projekt (som inte är en gem) kan listas i en särskild fil som kallas ”Gemfile” så att de kan installeras automatiskt av Bundler. Båda behandlas senare i den här guiden.

Vad är några exempel på gems?

  • Rails, och alla dess komponenter (ActiveRecord, ActiveSupport, etc.) distribueras som Ruby gems
  • Pry, det kraftfulla alternativet till irb
  • Nokogiri, en populär XML & HTML-parser

De flesta gems är ren Ruby-kod.

Ett fåtal gems innehåller ett Ruby C-förlängningstillägg för förbättrad prestanda.

Detta förlängningstillägg byggs automatiskt åt dig när du installerar gemen. I vissa fall kan du behöva installera ytterligare programvara manuellt som inte hanteras av RubyGems.

Nu:

Låt oss lära oss mer om gems genom att bygga din egen & och titta på filerna som utgör en gem.

Hur man bygger en RubyGem

Du kan förbereda filerna för en ny gem genom att köra bundle gem <name>.

Till exempel:

bundle gem awesome_gem

En gem består av följande struktur:

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

Den här .gemspecfilen är där du hittar all information om gemen.

Den innehåller:

  • Gem-namn
  • Gem-sammanfattning (kort beskrivning)
  • Författarnamn
  • Dependency list
  • En lista över filer som ska inkluderas i gemen
  • Optionellt: Författarens e-postadress, projektets URL (hemsida), körbara filer, c-tillägg, lång beskrivning.

Själva gem-versionen definieras som en konstant i lib/<gem_name>/version.rb.

Här är ett exempel på 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

Arrayen require_paths är den plats där Ruby letar efter dina gem-filer när du behöver dem. Detta gör att du kan lägga din kod under lib/<gem_name>/ & och sedan kräva den med require "<gem_name>/<file_name>".

Till exempel:

En fil som heter lib/awesome_gem/parser.rb skulle krävas som require "awesome_gem/parser" från var som helst i gemen.

Du kommer att ha de flesta av dina krav i lib/<gem_name>.rb (den enda filen vid roten av /lib).

Det är den filen som laddas när du require gemen!

Nästa:

De add_development_dependencyraderna definierar gems som du kommer att använda under utvecklingen.

Dessa är gems som minitest, RSpec eller pry.

Vidare add_dependency definierar gems som du använder som en del av din kod.

När du har ändrat sammanfattningen & beskrivning från standardvärdena… kan du ladda en irb-session med din gem med hjälp av bin/console-programmet som bundle gem skapar åt dig.

Exempel:

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

Därefter kan du paketera gemen med hjälp av gem build <name>.gemspec &publicera den till rubygems.org med hjälp av gem push.

Vad är Bundler?

När du lär dig om Ruby gems kanske du också läser om Bundler.

Men vad är Bundler egentligen?

Bundler är ett verktyg för hantering av beroenden.

Hanterade inte RubyGems redan detta?

Nja, det gör det… men bara för själva gemsen.

Din vanliga Ruby-applikation är inte byggd som en gem, så den får inte den här funktionen.

Det är därför Bundler finns!

Understanding Gemfiles

Har du sett de där Gemfile-filerna?

Det är där du skriver vilka gems du vill använda för din Ruby-applikation.

Dessa gems laddas åt dig utan att du behöver require dem.

En Gemfile ser ut så här:

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

Bundler (och RubyGems sedan version 2.0) kan läsa denna fil &installera de begärda versionerna av dessa gems.

Det här är vad du bör se när du kör kommandot 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.

Nu:

Vad är det för symboler (som ~>) som används när du deklarerar versionerna för varje gem i din Gemfile?

Dessa gör det möjligt för dig att begära ett intervall av versioner.

Du kan säga saker som: ”Jag vill att versionen ska vara lika med eller större än 1.2, men mindre än 2.0”.

Vilket skulle se ut så här:

gem 'puma', '~> 1.2'

~> är en förkortning för detta intervall:

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"

Du kan skicka ett branch-alternativ för att använda koden från en gren som inte är master.

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

Ett annat alternativ du kan hitta är require: false.

Vad gör det?

Det säger till Bundler att inte automatiskt kräva gemen åt dig. Det innebär att du måste require den i din kod när du behöver den.

Detta används för gems som har ett begränsat tillämpningsområde.

Till exempel:

Gems som du använder i en specifik rake-uppgift, men som du inte använder i dina Rails-kontroller &modeller. Fördelen är att du sparar minne i din app-kod eftersom du bara laddar den gemen när du behöver den.

Du kan också gruppera gems efter miljö.

Det innebär att du kan ha gems som bara installeras & laddas i utvecklingen (som capybara & pry).

Slutligt skapar Bundler en Gemfile.lock.

Vad är skillnaden?

En Gemfile.lock genereras automatiskt & den säger exakt vilka versioner av varje gem som installerades.

Bundler installerar dessa versioner så att när du distribuerar programmet till produktion eller delar ditt projekt med andra utvecklare kommer alla att arbeta med en identisk uppsättning gems.

Användbara gems & Bundler-kommandon

Kommando Beskrivning
gem list Listar alla dina installerade gems. Accepterar ett argument för att filtrera gems efter namn (exempel: gem list active)
gem which <name> Ge dig sökvägen där en gem är installerad.
gem search <name> Sök gems från konfigurerade källor (standard: rubygems.org). Tar ett reguljärt uttryck (exempel: gem search "\Aawesome_").
gem env Visar information om din gem-miljö (version, sökvägar, konfiguration).
gem install <name> -v <version> Låter dig installera en viss version av en gem (exempel: gem install sinatra -v 2.0.0).
bundle viz Genererar en visualisering av beroendegrafen för ditt aktuella projekt.
bundle show Visar information om en viss gem installerad via bundler. Måste finnas i en mapp med en Gemfile.
bundle outdated Visar en lista över föråldrade gems i det aktuella projektet. Kan använda alternativet --groups för att gruppera dem.
bundle console Kör en irb-session med gems från det aktuella projektets Gemfile.

Sammanfattning

Du har lärt dig om RubyGems, paketsystemet för Ruby. Du har också lärt dig hur en gem är strukturerad, vad en Gemfile är, Bundler & skillnaden mellan Gemfile & och Gemfile.lock.

Jag hoppas att du fann detta användbart!

Lämna ett svar

Din e-postadress kommer inte publiceras.