Bundler – bundle config e mais algumas coisas

O Bundler é para o mundo do Ruby o que o Ant é para o mundo do Java, ou npm para o mundo do node ou até mesmo o composer tenta ser para o mundo do PHP.

É uma ferramenta de muita utilidade para qualquer projeto, desde os menores e principalmente aos maiores, independente de framework ou qualquer outra coisa.

Pra você utilizado-lo é necessário instalar, utilizando o comando abaixo:

gem install bundler

Ele utiliza como referência para o seu trabalho o arquivo Gemfile, que é onde você adiciona todas as dependências do seu projeto. Algo como o exemplo abaixo.

source 'https://rubygems.org'

ruby '2.1.2'

# Rack

gem 'rack', '~> 1.5.2'

gem 'grape', '~> 0.8.0'

Na linha “source” é onde você diz para o bundler ir buscar os arquivos, existem algumas alternativas ao rubygems como o rubyforge, github ou bitbucket. É onde a sua gem está hospedada.

A segunda linha indica qual versão do Ruby necessária para rodar o seu projeto. Você pode user o rbenv ou o rvm para gerenciar as versões instaladas na sua máquina, outro dia falo mais sobre eles em algum post.

A linha com a hash # é uma linha comentário, o próprio dispensa comentários ;)

As duas últimas linhas dizem ao bundler quais dependências o seu projeto precisa,

gem <nome>, '<versao>'

O nome não tem segredo, já a versão é cheia de macetes:

‘1.5.2’ caso você coloque somente a versão, ele vai instalar especificamente a mencionada;

‘~> 1.5.2′ caso você coloque “~>”, significa que o bundler pode instalar versões maiores ou igual a 1.5.2 porém menor que 1.6

‘~> 1.5′ significa que o bundler pode instalar versões maiores ou igual a 1.5 porém menor que 2.0.

‘>= 1.5.2′ caso você coloque “>=” entram as versões maiores ou iguais

Posso utilizar uma gem armazenada diretamente na minha maquina adicionando o seguinte:

gem '<nome>', '<versao>', path: '<path-da-gem>'

Posso também falar que a gem está em um repositório git:

gem '<nome>', '<versao>', git: '<url-do-repositorio-git>'

Posso também falar que está em um repositório do github:

gem '<nome>', '<versao>', github: '<usuario-do-github>/<nome-do-projeto>'

Com o andamento do projeto o seu arquivo vai crescer, e você vai acabar percebendo que nem todas as gems são necessárias para rodar o seu projeto em produção por exemplo. Algumas são para te ajudar no debug em ambiente de desenvolvimento, você pode agrupar as gems para otimizar o seu projeto:

group :development do
gem 'pry'
gem 'byebug'
end

ou adicionar a cada gem:

gem '<nome>', '<versao>', group: [:development, :test]

Quando simultâneamente ao desenvolvimento do seu projeto, você precisa modificar uma gem que você também mantém, você pode utilizar a alternativa de apontar para um determinado path da sua maquina, porém quando for fazer o deploy, terá problemas pois o ambiente de produção é diferente do seu, para contornar isso, costumo fazer a seguinte combinação.

Adiciono no Gemfile a branch que estou trabalhando na minha máquina:

gem 'minha_gem', git: 'git@bitbucket.org:fabiotomio/minha_gem.git', branch: 'feature/nova_funcionalidade'

E no terminal, configuro o bundle para utilizar os arquivo em um path específico na minha maquina.

bundle config local.minha_gem ~/Projects/gems/minha_gem

Para remover:

bundle config --delete local.minha_gem

Uma vez o seu Gemfile criado, e suas gems configuradas dentro dele é só executar o comando:

bundle install

O Bundler entrará em ação e irá baixar todas as gems em suas versões dos repositórios definidos para o seu projeto rodar! =DDD

Quando ele terminar, aparecerá um arquivo chamado Gemfile.lock que nele estão congeladas as versões de todas as gems instaladas.

Quando ele existir o Bundler levará ele (Gemfile.lock) em consideração e não o Gemfile, a explicação disso é simples, como as gems são mantidas por muitas pessoas e caso você não especifique uma versão da mesma, o que é muito comum de alguns desenvolvedores fazerem, existe a possibilidade de você não conseguir rodar o seu projeto quando você for fazer o deploy por exemplo, depois de alguns dias de desenvolvimento, pelo simples motivo da gem ser atualizada pela comunidade e justamente as funcionalidades que você consumiu terem mudado, o seu projeto pode quebrar! Por isso é interessante entender como é feito o versionamento e qual a diferença entre os “numerozinhos” que definem cada versão e adicionar essa informação no Gemfile!

Tem muita coisa ainda pra falar sobre o Bundler, mas acho que pra quem está com um pouco de dificuldades e quer uma dose homeopática sobre o bundler, consegui cumprir com esse texto. Essas informações já vão desmistificar um pouco o Gemfile, e ajudar você com os diferentes ambientes que precisamos lidar no dia a dia do desenvolvimento.

Não tenho a ambição de cobrir todo assunto, para os curiosos, seguem alguns links que podem ajudar:

http://bundler.io/#getting-started
http://www.caelum.com.br/apostila-ruby-on-rails/a-linguagem-ruby/#2-4-bundler
http://bundler.io/v1.3/man/bundle-config.1.html
http://stackoverflow.com/questions/4487948/how-can-i-specify-a-local-gem-in-my-gemfile
http://ryanbigg.com/2013/08/bundler-local-paths/
http://oldblog.judofyr.net/posts/dont-forget-about-rubyforge.html

Grande abraço e até a próxima.