O que é uma Gema Ruby?

Quando aprendi sobre Gemas Ruby, elas pareciam bastante mágicas. Ao correr bundle install Eu poderia de alguma forma adquirir estas gemas mágicas que fariam o meu código fazer todo o tipo de coisas que pareciam muito além das minhas habilidades de estudante de Flatiron da Semana 1. Parecido com “caixas de itens” em Mario Kart, as gemas parecem conferir super poderes ao usuário.

>

Gemas Ruby dão poderes mágicos!

Pretendo usar o meu blog para me aprofundar em conceitos de programação que despertam a minha curiosidade e que eu não entendo completamente. Para o meu primeiro post no blog, vou desmascarar a natureza mística e mágica das gemas Ruby.

O que é uma Gema Ruby?

Não, as gemas Ruby não são mágicas. São simplesmente bibliotecas de código aberto que contêm código Ruby e são empacotadas com um pouco de dados extra. Usar uma gema permite a um programador usar o código dentro da gema no seu próprio programa, sem inserir explicitamente esse código.

Gems podem ser usadas para todos os tipos de propósitos, e você pode explorar diferentes gemas em https://rubygems.org/. Para ter uma ideia melhor do que as gemas podem fazer, aqui estão algumas gemas populares e suas funcionalidades:

  • Bundler – Fornece um ambiente consistente para projetos Ruby, rastreando e instalando as gemas e versões exatas que são necessárias. É a gem #1 baixada de todos os tempos, mas mais sobre Bundler mais tarde.
  • RSpec – Um framework de testes que suporta Behavior Driven Development para Ruby.
  • Devise – O Devise funciona com autenticação. Para qualquer website que precisa fazer login do usuário, o Devise manipula o login, registro, redefinição de senha, etc.
  • JSON – Fornece uma API para analisar JSON a partir de texto.
  • Nokogiri – Fornece analisadores HTML, XML, SAX, e Reader com suporte a XPath e CSS selector.
  • Rails – Rails é uma jóia! Rails fornece o framework fullstack que permite que Ruby seja transformado em aplicações web.

Installing Gems

Today, usar gems é fácil! Instalar gemas localmente é tão simples quanto um único comando: gem install . O comando install vai buscar o código, baixa-o para o seu computador, e instala a gema e quaisquer dependências necessárias. Finalmente, ele irá construir a documentação para as gemas instaladas.

>

>

Instalar o bundler requer apenas a instalação de 1 gem

Embora algumas gems, como o Bundler, requerem apenas 1 gem para serem instaladas, outras gems possuem dependências que requerem a instalação de múltiplas gems:

>

Instalar a Draper também requereu a instalação da Loja de Pedidos e das gemas do Serializador de Modelos Ativos
>

Para ver todas as gemas instaladas localmente, use o comando, gem list .

Utilizar gemas

Agora, mais importante, como podemos utilizar as nossas gemas instaladas? Bem, isso depende do tipo de gema. Algumas gems, como Rails, são programas Ruby independentes que você pode executar a partir do comando.

Outras são relativamente inúteis por si só, mas incrivelmente úteis quando usadas dentro de um projeto. Para usar uma gem de dentro do seu código, é necessário requerê-la primeiro no topo do arquivo – require 'gem_name' . Por exemplo, o Pry tornou-se rapidamente uma das minhas gemas favoritas quando se trabalha em projetos. Meu código i̶s̶n̶’̶t̶ ̶a̶l̶w̶a̶y̶s̶ quase nunca está correto quando eu o escrevo pela primeira vez, e Pry torna a depuração muito mais eficiente e um pouco menos dolorosa. Na semana passada, nós aprendemos sobre as APIs e precisamos do Pry e de algumas outras gemas para completar o projeto.

Embora as gemas sejam muito simples se você só precisar delas no seu computador, elas se tornam um pouco mais complicadas se você quiser distribuir ou publicar o seu projeto. Qualquer outra pessoa que execute o seu projecto terá de ter todas as gemas necessárias e as versões correctas instaladas no seu computador. Felizmente, temos RubyGems e Bundler que simplificam o processo.

RubyGems é o Framework que Simplifica o Compartilhamento de Gemas

Parte da magia das gemas é que todos nós podemos usá-las, e RubyGems é o gerenciador de pacotes que torna isso possível. Ele fornece um formato padrão para distribuição de gems Ruby, gerencia a instalação de gems, e um servidor para distribuí-las. RubyGems não foi lançado ao público até 14 de Março de 2004 (Pi Day! π) Apesar de RubyGems existir desde Ruby 1.8, não fazia parte da distribuição standard de Ruby até Ruby 1.9. Assim, para novatos em Ruby, como eu, RubyGems é automaticamente instalado no seu computador quando instala Ruby.

Como é que os RubyGems alguma vez viveram sem RubyGems?

A vida era muito mais difícil. Se você quer a história completa, eu recomendaria muito assistir a apresentação de André Arko “Como o Bundler funciona, afinal?” da RailsConf 2015. Aqui está minha versão resumida:

>

Código de carregamento iniciado com require , e usar require é essencialmente o mesmo que inserir o código em seu arquivo. Na sua forma mais simples, é um método que extrai código do arquivo de argumento.

def require(filename)
eval File.name(filename)
end

Require permite aos usuários carregar qualquer código local, procurando o $LOAD_PATH do usuário para o arquivo. $LOAD_PATH é uma variável global e um array de caminhos absolutos. Desde que o diretório do código esteja localizado em algum lugar dentro do $LOAD_PATH, require será capaz de encontrá-lo.

>

Embora require seja ótimo para código local, e se você quisesse obter código de outra pessoa? Foi um processo tedioso – você precisaria encontrar o código, baixá-lo, salvá-lo em algum lugar no seu computador e adicioná-lo em algum lugar ao $LOAD_PATH.

Como resultado, setup.rb evoluiu para facilitar o processo. Setup.rb (que ainda está por aí) é um instalador genérico para scripts e bibliotecas Ruby. Foi uma grande melhoria em relação a porque copiou todos os ficheiros Ruby para um directório que já se encontrava no $LOAD_PATH. Os desenvolvedores são inerentemente preguiçosos, e o setup.rb nos salvou alguns passos. No entanto, setup.rb tinha o seu próprio conjunto de problemas. Não havia rastreamento de versão e não havia maneira de desinstalar um programa! A única maneira definitiva de saber qual versão você tinha era anotar o número da versão na instalação. Como você pode imaginar, usar bibliotecas foi um pequeno desastre.

Em 2004, RubyGems veio em socorro! Agora o código de outras pessoas, ou gems, podia ser instalado ou desinstalado com um único comando! Foi revolucionário. RubyGems tinha outro truque na manga – podia lidar com diferentes versões de software, e cada versão era mantida na sua própria pasta separada.

Bundler Soluciona Dependências de Gemas

Como o RubyGems parecia incrível, ele tinha uma falha inerente. Se queria partilhar um projecto, como se certificou que um novo utilizador tinha todas as gemas necessárias? Com a configuração actual do RubyGems, se um programador corresse gem install foo e começasse a utilizar uma nova gema na aplicação, outros programadores no projecto precisariam de ser avisados para correr gem install foo . Certas gemas só poderiam funcionar com certas versões de outras gemas, e tornou-se cada vez mais difícil coordenar dependências de gemas e versões.

Alas, chegamos ao Bundler! Bundler existe para resolver o problema de dependência de versões de gemas, rastreando e instalando as gemas e versões exatas que são necessárias. O Bundler trabalha através de um “gemfile” Ruby que diz ao Bundler quais gems procurar e onde procurar por elas. https://rubygems.org é o fonte padrão, mas se as gems existem em um servidor privado, esse fonte pode ser sobrescrito para essas gems específicas.

Example Gemfile – Source: http://bundler.io/rationale.html

Após instalar as gemas necessárias (se o seu computador ainda não as tiver), o Bundler irá escrever todas as gemas e versões que instalou em outro arquivo, Gemfile.lock. Este arquivo lock permite instalar exatamente as mesmas versões em todas as máquinas que rodam o aplicativo.

Usar o Bundler é simples. Primeiro, é necessário instalá-lo, e como o Bundler é uma gem em si, podemos fazer isso com ele: gem install bundler . Com o Bundler instalado, você pode usar qualquer gem em seu próprio projeto em 2 passos:

  1. Adicionar a gem a um arquivo Gem na raiz do seu projeto
  2. Executar bundle install no seu terminal

Para mais especificações do Bundler, confira http://bundler.io/.

Deixe uma resposta

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