Ruby Gems, Gemfile & Bundler (The Ultimate Guide)

O que é uma gema Ruby?

Uma gema é um pacote que você pode baixar & instalar. Quando você requer uma gem instalada você está adicionando funcionalidades extras ao seu programa Ruby.

Gems permitem que você:

  • Adicione um recurso de login ao seu aplicativo Rails
  • Trabalhe facilmente com serviços externos (como APIs)
  • Build uma aplicação web

São apenas alguns exemplos. Cada gema tem seu próprio objetivo.

Por que usamos gemas?

  • É assim que compartilhamos bibliotecas & Ferramentas em Ruby
  • A estrutura de arquivos & Formato de uma gema torna fácil entender como elas funcionam
  • Uma especificação (“.spec”) que vem com cada gem descreve dependências (outras gems necessárias) para que o código tenha tudo o que precisa para funcionar

Alegado ao RubyGems, nós temos um rico ecossistema de bibliotecas úteis a apenas uma gem install longe!

Uma lista de gems necessárias para um determinado projeto (não-gem) pode ser listada em um arquivo especial chamado “Gemfile” para que eles possam ser instalados automaticamente pelo Bundler. Ambos cobertos mais tarde neste guia.

Quais são alguns exemplos de gems?

  • Rails, e todos os seus componentes (ActiveRecord, ActiveSupport, etc.).) são distribuídos como gemas Ruby
  • Pry, a poderosa alternativa ao irb
  • Nokogiri, um popular XML & Parser HTML

A maioria das gemas são puro código Ruby.

A maioria das gemas inclui uma extensão Ruby C para melhorar a performance.

Esta extensão é construída automaticamente para você quando você instala a gema. Em alguns casos, você pode precisar de instalar manualmente software adicional que não é gerido pelo RubyGems.

Agora:

Vamos aprender mais sobre gems construindo o seu próprio & olhando para os ficheiros que fazem uma gem.

Como construir um RubyGem

Pode preparar os ficheiros para uma nova gem ao correr bundle gem <name>.

Por exemplo:

bundle gem awesome_gem

A Gem é composta da seguinte estrutura:

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

Este ficheiro .gemspec é onde encontrará toda a informação sobre a gem.

Inclui:

  • Nome da gema
  • Resumo da gema (breve descrição)
  • Nome do autor
  • Lista de dependências
  • Lista de ficheiros a incluir na gema
  • Opcional: Endereço de e-mail do autor, URL do projecto (homepage), executáveis, extensões c, descrição longa.

A versão gem em si é definida como uma constante em lib/<gem_name>/version.rb.

Aqui está um exemplo 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

A matriz require_paths é onde o Ruby irá procurar os seus ficheiros gem quando os necessitar. Isto permite-lhe colocar o seu código em lib/<gem_name>/ & e depois requerê-lo com require "<gem_name>/<file_name>".

Por exemplo:

Um ficheiro chamado lib/awesome_gem/parser.rb seria requerido como require "awesome_gem/parser" de qualquer lugar dentro da gem.

Você terá a maioria dos seus requerimentos em lib/<gem_name>.rb (o único ficheiro na raiz de /lib).

Esse é o ficheiro que é carregado quando você require a gema!

Próximo:

As linhas add_development_dependency definem gemas que você vai usar durante o desenvolvimento.

Estas são gemas como minitest, RSpec, ou pry.

Enquanto que add_dependency define gemas que você usa como parte do seu código.

Após você ter alterado o resumo & descrição dos valores padrão… você poderá carregar uma sessão irb com sua gem usando o programa bin/console que bundle gem cria para você.

Exemplo:

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

Então você pode empacotar a gem usando gem build <name>.gemspec & publicá-la em rubygems.org usando gem push.

O que é Bundler?

Apesar de aprender sobre as gemas Ruby você também pode ler sobre Bundler.

Mas o que é Bundler exatamente?

Bundler é uma ferramenta para gerenciamento de dependências.

O RubyGems já não lê isso?

Bem, ele faz… mas somente para as próprias gemas.

A sua aplicação Ruby regular não é construída como uma gema, por isso não obtém esta funcionalidade.

É por isso que o Bundler existe!

Compreendendo os ficheiros Gem

Viu aqueles Gemfile ficheiros?

É aí que escreve as gemas que quer usar para a sua aplicação Ruby.

Essas gemas serão carregadas para si sem ter de require them.

Um ficheiro Gemfile parecido com isto:

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

Bundler (e RubyGems desde a versão 2.0) pode ler este ficheiro & instalar as versões solicitadas destas gemas.

Isso é o que você deve ver ao executar o comando bundle install comando:

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.

Agora:

O que são estes símbolos (como ~>) usados ao declarar as versões para cada gema no seu Gemfile?

Estes permitem que você solicite uma gama de versões.

Você pode dizer coisas como, “Eu quero que a versão seja igual ou maior que 1.2, mas inferior a 2.0”.

Que se pareça com isto:

gem 'puma', '~> 1.2'

O ~> é um atalho para este intervalo:

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"

Pode passar uma opção branch para usar o código de um ramo que não é mestre.

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

Outra opção que você pode encontrar é require: false.

O que isso faz?

Diz ao Bundler para não exigir automaticamente a gema para você. Isto significa que você terá que require no seu código quando você precisar.

Isto é usado para gems que são limitadas no escopo.

Por exemplo:

Gems que você usa em uma tarefa rake específica, mas você não usa em seus controladores Rails modelos &. O benefício é que você salva memória no seu código de aplicação porque você só carrega aquela gem quando precisa dela.

Você também pode agrupar gems por ambiente.

Isso significa que você pode ter gems que só são instaladas & carregadas em desenvolvimento (como capybara & pry).

Finalmente, o bundler cria uma Gemfile.lock.

Qual é a diferença?

A Gemfile.lock é auto-gerada & diz exactamente que versões de cada gema foram instaladas.

Bundler irá instalar estas versões, assim quando você implantar esta aplicação em produção, ou compartilhar seu projeto com outros desenvolvedores, todos estarão trabalhando com um conjunto idêntico de gemas.

Gema útil &Comandos Bundler

Comando Descrição
Listagem Lista todas as suas gemas instaladas. Aceita um argumento para filtrar gemas pelo nome (exemplo: gem list active)
gem que <nome> Dá-te o caminho onde uma gema está instalada.
>buscagemgem <nome> Procurar gemas a partir de fontes configuradas (padrão: rubygems.org). Toma uma expressão regular (exemplo: gem search "\Aawesome_").
gem env Exibe informação sobre o seu ambiente gem (versão, caminhos, configuração).
instalargem <nome> -v <versão> Permite instalar uma versão gem específica (exemplo: gem install sinatra -v 2.0.0).
bundle viz Gera uma visualização do gráfico de dependência para seu projeto atual.
bundle show Shows info about a particular gem installed via bundler. Deve estar dentro de uma pasta com um Gemfile.
bundle outdated Exibe uma lista de gems desatualizadas no projeto atual. Pode usar a opção --groups para agrupá-las.
Consolabundle Executar uma sessão irb com as gemas do projecto actual Gemfile.

Sumário

Tem aprendido sobre RubyGems, o sistema de pacotes para Ruby. Você também aprendeu como uma gema é estruturada, o que é um Gemfile, Bundler & a diferença entre os Gemfile & os Gemfile.lock.

Eu espero que você tenha achado isto útil!

Deixe uma resposta

O seu endereço de email não será publicado.