Finalmente eu entendi o Bundler e o Gemfile!

🇬🇧 🇧🇷

Evitar o efeito “funciona (apenas) na minha máquina” é um dos objetivos críticos do DevOps. E utilizar adequadamente um sistema de gerenciamento de dependências para sua aplicação é uma parte importante disso!

Minha experiência com ferramentas de gerenciamento de dependência é mais com o Maven pra Java e o Pip pra Python. De vez em quando também faço umas coisas em Ruby, e confesso que tive muita dificuldade em entender o Bundler. Eu não entendia algumas coisas tipo: pra que o arquivo Gemfile.lock?; se o Gemfile.lock deveria ou não ser versionado; por que algumas pessoas falavam pra executar comandos usando bundle exec; e (já que não manjava do bundle exec) como que diferentes aplicações na mesma máquina usavam diferentes versões das bibliotecas.

Então, ao fazer este site, finalmente esbarrei com os trechos da documentação que me esclareceram as coisas:

bundle-install - Instala as dependências especificadas no seu Gemfile

Instala as gems especificadas no seu Gemfile. Se essa é a primeira vez que você executa o bundle install (e o Gemfile.lock não existe), o Bundler irá buscar todas as fontes remotas, resolver as dependências e instalar todas as gems necessárias.

Se o Gemfile.lock já existe, e você não alterou seu Gemfile, o Bundler irá buscar todas as fontes remotas, mas considerará as dependências especificadas no Gemfile.lock em vez de resolver as dependências.

Se o Gemfile.lock já existe, e você alterou o Gemfile, o Bundler considerará todas as dependências do Gemfile.lock para todas as gems que você não atualizou (no Gemfile), mas irá re-resolver as dependências das gems que você atualizou.

Documentação original do bundle install

Obs: portanto, concluo que o Gemfile.lock deve sim ser versionado, de forma que assim todos os desenvolvedores vão acabar usando as mesmas versões das bibliotecas.

bundle-exec - Executa um comando no contexto do bundle

Esse comando executa o comando, disponibilizando todas as gems especificadas no Gemfile para o programa Ruby.

Documentação original do bundle exec