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