>
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.