Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

Wat is een Ruby gem?

Een gem is een pakket dat u kunt downloaden & installeren. Wanneer u een geïnstalleerde gem nodig hebt, voegt u extra functionaliteit aan uw Ruby-programma toe.

Gems stellen u in staat om:

  • Een login-functie aan uw Rails-app toe te voegen
  • Gemakkelijk met externe services (zoals API’s) te werken
  • Een webapplicatie te bouwen

Dit zijn slechts enkele voorbeelden. Elke gem heeft zijn eigen doel.

Waarom gebruiken we gems?

  • Hiermee delen we bibliotheken & tools in Ruby
  • De bestandsstructuur & van een gem maakt het makkelijk te begrijpen hoe ze werken
  • Een specificatie (“.spec”) bestand dat bij elke gem wordt geleverd, beschrijft afhankelijkheden (andere vereiste gems) zodat de code alles heeft wat het nodig heeft om te werken

Dankzij RubyGems hebben we een rijk ecosysteem van nuttige bibliotheken op slechts één gem install afstand!

Een lijst met gems die nodig zijn voor een bepaald (niet-gem) project kan worden vermeld in een speciaal bestand genaamd “Gemfile”, zodat ze automatisch kunnen worden geïnstalleerd door Bundler. Beide worden later in deze gids behandeld.

Wat zijn enkele voorbeelden van gems?

  • Rails, en al zijn componenten (ActiveRecord, ActiveSupport, enz.) worden gedistribueerd als Ruby gems
  • Pry, het krachtige alternatief voor irb
  • Nokogiri, een populaire XML & HTML parser

De meeste gems zijn pure Ruby code.

Een paar gems bevatten een Ruby C extensie voor betere prestaties.

Deze extensie wordt automatisch voor u gebouwd wanneer u de gem installeert. In sommige gevallen moet u handmatig extra software installeren die niet door RubyGems wordt beheerd.

Nu:

Laten we meer leren over gems door uw eigen & te bouwen en te kijken naar de bestanden die een gem maken.

Hoe bouw je een RubyGem

Je kunt de bestanden voor een nieuwe gem voorbereiden door bundle gem <name> uit te voeren.

Voorbeeld:

bundle gem awesome_gem

Een Gem bestaat uit de volgende structuur:

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

In dit .gemspec bestand vindt u alle informatie over de Gem.

Het bevat:

  • Gem naam
  • Gem samenvatting (korte beschrijving)
  • Auteursnaam
  • Dependency lijst
  • Een lijst van bestanden om in de gem op te nemen
  • Optioneel: Emailadres van de auteur, URL van het project (homepage), uitvoerbare bestanden, c-extensies, lange beschrijving.

De gem-versie zelf wordt gedefinieerd als een constante in lib/<gem_name>/version.rb.

Hier een voorbeeld 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

De require_paths array is waar Ruby naar uw gem-bestanden zal zoeken wanneer u ze nodig hebt. Dit stelt u in staat om uw code onder lib/<gem_name>/ & te zetten en deze vervolgens te vereisen met require "<gem_name>/<file_name>".

Voorbeeld:

Een bestand met de naam lib/awesome_gem/parser.rb zou worden vereist als require "awesome_gem/parser" vanaf elke plek binnen de gem.

U zult het grootste deel van uw vereist hebben in lib/<gem_name>.rb (het enige bestand aan de wortel van /lib).

Dat is het bestand dat wordt geladen als je require de gem

Volgende:

De add_development_dependency regels definiëren gems die je gaat gebruiken tijdens de ontwikkeling.

Dit zijn gems zoals minitest, RSpec, of pry.

Terwijl add_dependency gems definieert die je gebruikt als onderdeel van je code.

Als je eenmaal de samenvatting & van de standaard waarden hebt veranderd… kun je een irb sessie laden met je gem met behulp van het bin/console programma dat bundle gem voor je maakt.

Voorbeeld:

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

Dan kun je de gem verpakken met gem build <name>.gemspec & en publiceren naar rubygems.org met gem push.

Wat is Bundler?

Terwijl u over Ruby gems leert, leest u misschien ook over Bundler.

Maar wat is Bundler precies?

Bundler is een hulpmiddel voor afhankelijkheidsbeheer.

Ging RubyGems daar niet al mee om?

Wel, dat doet het… maar alleen voor de gems zelf.

Uw gewone Ruby applicatie is niet gebouwd als een gem, dus het krijgt deze functie niet.

Daarom bestaat Bundler!

Uitleg Gemfiles

Heb je die Gemfile bestanden gezien?

Daarin schrijf je welke gems je wilt gebruiken voor je Ruby applicatie.

Deze gems worden voor u geladen zonder dat u require ze hoeft te

Een Gemfile ziet er als volgt uit:

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

Bundler (en RubyGems sinds versie 2.0) kan dit bestand lezen & installeert de gevraagde versies van deze gems.

Dit is wat u zou moeten zien als u het bundle install commando uitvoert:

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:

Wat zijn deze symbolen (zoals ~>) die gebruikt worden bij het declareren van de versies voor elke gem in uw Gemfile?

Hiermee kunt u een reeks versies aanvragen.

U kunt dingen zeggen als, “Ik wil dat de versie gelijk is aan of groter is dan 1.2, maar kleiner dan 2.0”.

Wat er als volgt uit zou zien:

gem 'puma', '~> 1.2'

De ~> is een afkorting voor dit bereik:

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"

U kunt een branch optie doorgeven om de code van een tak te gebruiken die niet master is.

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

Een andere optie die u kunt vinden is require: false.

Wat doet dat?

Het vertelt Bundler om de gem niet automatisch voor u te vereisen. Dit betekent dat je de gem require in je code moet invoeren wanneer je hem nodig hebt.

Dit wordt gebruikt voor gems die een beperkte reikwijdte hebben.

Bijvoorbeeld:

Gems die je gebruikt in een specifieke rake-taak, maar die je niet gebruikt in je Rails controllers &-modellen. Het voordeel is dat je geheugen bespaart in je app-code omdat je die gem alleen laadt wanneer je hem nodig hebt.

Je kunt gems ook groeperen per omgeving.

Dat betekent dat je gems kunt hebben die alleen & in ontwikkeling worden geladen (zoals capybara & pry).

Ten slotte maakt bundler een Gemfile.lock aan.

Wat is het verschil?

Een Gemfile.lock wordt automatisch gegenereerd & er staat precies in welke versies van elke gem zijn geïnstalleerd.

Bundler installeert deze versies, zodat iedereen met dezelfde set gems werkt wanneer u deze toepassing in productie neemt of uw project deelt met andere ontwikkelaars.

Bruikbare gem &Bundler-opdrachten

Command Description
gem list Lijst van al uw geïnstalleerde gems. Accepteert een argument om edelstenen op naam te filteren (voorbeeld: gem list active)
gem which <name> Geeft u het pad waar een edelsteen is geinstalleerd.
gem search <name> Zoek naar edelstenen van geconfigureerde bronnen (standaard: rubygems.org). Neemt een reguliere expressie (voorbeeld: gem search "\Aawesome_").
gem env Toont informatie over uw gem omgeving (versie, paden, configuratie).
gem install <name> -v <version> Hiermee kunt u een specifieke gem versie installeren (voorbeeld: gem install sinatra -v 2.0.0).
bundle viz Geeft een visualisatie van de afhankelijkheidsgrafiek voor uw huidige project.
bundle show Geeft informatie over een bepaalde edelsteen die via bundler is geïnstalleerd. Moet in een map staan met een Gemfile.
bundle outdated Toont een lijst van verouderde gems in het huidige project. Kan de --groups optie gebruiken om ze te groeperen.
bundle console Draait een irb sessie met de gems uit de Gemfile van het huidige project.

Samenvatting

U heeft geleerd over RubyGems, het package systeem voor Ruby. U heeft ook geleerd hoe een Gem is opgebouwd, wat een Gemfile is, Bundler & het verschil tussen de Gemfile & de Gemfile.lock.

Ik hoop dat u dit nuttig vond!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.