Ruby Gems, Gemfile & Bundler (Den ultimative guide)

Hvad er en Ruby gem?

En gem er en pakke, som du kan downloade & og installere. Når du kræver en installeret gem, tilføjer du ekstra funktionalitet til dit Ruby-program.

Gems giver dig mulighed for:

  • Af tilføje en login-funktion til din Rails-app
  • Let at arbejde med eksterne tjenester (som API’er)
  • Opbygge en webapplikation

Det er blot nogle eksempler. Hver gem har sit eget mål.

Hvorfor bruger vi gems?

  • Det er sådan, vi deler biblioteker & værktøjer i Ruby
  • Filstruktur &formatet for en gem gør det nemt at forstå, hvordan de fungerer
  • En specifikation (“.spec”) fil, der følger med hver gem, beskriver afhængigheder (andre nødvendige gems), så koden har alt det, den skal bruge for at fungere

Takket være RubyGems har vi et rigt økosystem af nyttige biblioteker, der kun er gem install ét gem install skridt væk!

En liste over gems, der er nødvendige for et givet (ikke-gem) projekt, kan være opført på en særlig fil kaldet “Gemfile”, så de automatisk kan installeres af Bundler. Begge dele er dækket senere i denne vejledning.

Hvad er nogle eksempler på gems?

  • Rails og alle dets komponenter (ActiveRecord, ActiveSupport osv.) distribueres som Ruby-perler
  • Pry, det kraftfulde alternativ til irb
  • Nokogiri, en populær XML & HTML-parser

De fleste perler er ren Ruby-kode.

Et par perler indeholder en Ruby C-udvidelse for at forbedre ydeevnen.

Denne udvidelse bygges automatisk for dig, når du installerer perlen. I nogle tilfælde skal du måske manuelt installere yderligere software, som ikke administreres af RubyGems.

Nu:

Lad os lære mere om gems ved at bygge din egen & og se på de filer, der udgør en gem.

Sådan opbygger du en RubyGem

Du kan forberede filerne til en ny gem ved at køre bundle gem <name>.

Til eksempel:

bundle gem awesome_gem

En gem består af følgende 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

Denne .gemspec fil er den fil, hvor du finder alle oplysninger om gem’en.

Den indeholder:

  • Gemmens navn
  • Gemmens resumé (kort beskrivelse)
  • Author name
  • Dependency list
  • En liste over filer, der skal inkluderes i gem’en
  • Optional: Forfatterens e-mail-adresse, projektets URL (hjemmeside), eksekverbare filer, c-udvidelser, lang beskrivelse.

Selve gem-versionen er defineret som en konstant i lib/<gem_name>/version.rb.

Her er et eksempel på en 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

Arrayet require_paths er der, hvor Ruby leder efter dine gem-filer, når du har brug for dem. Dette giver dig mulighed for at lægge din kode under lib/<gem_name>/ & og derefter kræve den med require "<gem_name>/<file_name>".

For eksempel:

En fil med navnet lib/awesome_gem/parser.rb vil blive krævet som require "awesome_gem/parser" fra et hvilket som helst sted i gem’en.

Du vil have de fleste af dine krav i lib/<gem_name>.rb (den eneste fil ved roden af /lib).

Det er den fil, der bliver indlæst, når du require gem’en!

Næste:

De add_development_dependency linjer definerer gem’er, som du vil bruge under udviklingen.

Det er gem’er som minitest, RSpec eller pry.

Mens add_dependency definerer gem’er, som du bruger som en del af din kode.

Når du har ændret resuméet & beskrivelse fra standardværdierne… vil du kunne indlæse en irb-session med din perle ved hjælp af bin/console programmet, som bundle gem opretter for dig.

Eksempel:

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

Så kan du pakke perlen ved hjælp af gem build <name>.gemspec & udgive den til rubygems.org ved hjælp af gem push.

Hvad er Bundler?

Mens du lærer om Ruby-perler, læser du måske også om Bundler.

Men hvad er Bundler egentlig?

Bundler er et værktøj til styring af afhængigheder.

Håndterede RubyGems ikke allerede dette?

Jamen, det gør det… men kun for selve perlerne.

Din almindelige Ruby-applikation er ikke bygget som en gem, så den får ikke denne funktion.

Det er derfor Bundler findes!

Forståelse af Gemfiles

Har du set de Gemfile-filer?

Det er der, hvor du skriver, hvilke gems du vil bruge til din Ruby-applikation.

Disse gems vil blive indlæst for dig uden at du behøver at require dem.

En Gemfile ser således ud:

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

Bundler (og RubyGems siden version 2.0) kan læse denne fil & installere de ønskede versioner af disse gems.

Dette er, hvad du bør se, når du kører kommandoen 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:

Hvad er disse symboler (som ~>), der bruges, når du angiver versionerne for hver enkelt gem i din Gemfile?

Disse giver dig mulighed for at anmode om et interval af versioner.

Du kan sige ting som: “Jeg vil have, at versionen skal være lig med eller større end 1.2, men mindre end 2.0”.

Det ville se således ud:

gem 'puma', '~> 1.2'

~> er en forkortelse for dette interval:

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 angive en branch-indstilling for at bruge koden fra en gren, der ikke er master.

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

En anden indstilling, du kan finde, er require: false.

Hvad gør det?

Det fortæller Bundler, at det ikke automatisk skal kræve perlen for dig. Det betyder, at du skal require den i din kode, når du har brug for den.

Dette bruges til perler, der har et begrænset anvendelsesområde.

For eksempel:

Perler, som du bruger i en specifik rake-opgave, men som du ikke bruger i dine Rails-controllere &modeller. Fordelen er, at du sparer hukommelse i din app-kode, fordi du kun indlæser den pågældende perle, når du har brug for den.

Du kan også gruppere perler efter miljø.

Det betyder, at du kan have perler, der kun er installeret & indlæst i udvikling (som capybara & pry).

Endeligt opretter bundler en Gemfile.lock.

Hvad er forskellen?

En Gemfile.lock genereres automatisk & den siger præcis, hvilke versioner af hver perle der blev installeret.

Bundler installerer disse versioner, så når du distribuerer denne applikation til produktion eller deler dit projekt med andre udviklere, vil alle arbejde med et identisk sæt af gems.

Nyttig perle & Bundler-kommandoer

Kommando Beskrivelse
gem-liste Oplys alle dine installerede perler. Accepterer et argument til filtrering af perler efter navn (eksempel: gem list active)
gem which <name> Giver dig stien, hvor en perle er installeret.
gem search <name> Søger perler fra konfigurerede kilder (standard: rubygems.org). Tager et regulært udtryk (eksempel: gem search "\Aawesome_").
gem env Viser oplysninger om dit gem-miljø (version, stier, konfiguration).
gem install <name> -v <version> Giver dig mulighed for at installere en bestemt gem-version (eksempel: gem install sinatra -v 2.0.0).
bundle viz Genererer en visualisering af afhængighedsgrafen for dit aktuelle projekt.
bundle show Giver oplysninger om en bestemt perle, der er installeret via bundler. Skal være i en mappe med en Gemfile.
bundle outdated Viser en liste over forældede gems i det aktuelle projekt. Kan bruge indstillingen --groups til at gruppere dem.
bundle console Kører en irb-session med perler fra det aktuelle projekts Gemfile.

Summary

Du har lært om RubyGems, pakkesystemet for Ruby. Du har også lært, hvordan en gem er struktureret, hvad en Gemfile er, Bundler & forskellen mellem Gemfile & og Gemfile.lock.

Jeg håber, at du fandt dette nyttigt!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.