Uma Comparação de Gerenciadores de Versões Ruby para macOS

Neste artigo, compararei os gerenciadores de versão mais populares para Ruby em um Mac: Chruby, Rbenv e RVM, bem como Asdf, um gerenciador de versão para múltiplas linguagens, e Frum, um gerenciador de versão recentemente criado escrito em Rust. Farei recomendações com base no que você provavelmente mais precisará.

Ruby Pré-instalada Não é para Desenvolvedores

Pessoas que estão começando com Ruby ficam encantadas ao descobrir que Ruby vem pré-instalado no macOS. Muitas vezes ficam decepcionadas quando um desenvolvedor mais experiente diz a elas: “Não use o Ruby do sistema Mac.” Escrevi em outro lugar sobre os motivos. Em resumo, o Ruby do sistema está lá para o macOS, não para você. É bom para executar scripts de utilitários, mas para o desenvolvimento, o Ruby do sistema está desatualizado e, se você não for cuidadoso, a instalação de gems pode causar dores de cabeça (incluindo violações de segurança do sistema).

O Problema do Homebrew com um Ruby

O Homebrew é o gerenciador de pacotes que se tornou praticamente padrão para adicionar software para desenvolvedores no macOS. O Homebrew facilita a instalação de uma nova versão do Ruby para evitar depender do Ruby do sistema. Mas existem dois problemas com o Homebrew. Primeiro, a versão do Ruby do Homebrew pode ser substituída automaticamente e inesperadamente por uma versão mais recente quando outros pacotes do Homebrew são instalados (um problema resolvido pelo brew pin ruby). Mais importante, o Homebrew só permite que você instale uma versão do Ruby. Se você está desenvolvendo ou mantendo mais de um projeto em Ruby, provavelmente precisará alternar entre versões do Ruby. É aí que você precisará de um gerenciador de versão.

Asdf para Múltiplas Linguagens

Asdf é um gerenciador de versões que suporta múltiplas linguagens. Se você está usando Ruby para desenvolver aplicações web com Rails 6, precisará instalar Node e Yarn para construir uma aplicação inicial do Rails. (O Rails 7 pode eliminar a necessidade de Node, mas isso ainda não está certo neste momento.)

Então, para um desenvolvedor Rails, Asdf é um gerenciador de versões ideal. Também será útil se você desenvolver aplicações em Python, Elixir ou em muitas outras linguagens (veja uma lista de linguagens suportadas). Existe alguma desvantagem em usar Asdf? Apenas duas. Ele usa shims para interceptar comandos comuns, o que pode dificultar a solução de problemas. Além disso, pode ser um pouco lento para algumas operações. Se você está desenvolvendo em várias linguagens, recomendo que experimente Asdf para ver se gosta. Troque para Frum, o gerenciador de versões apenas para Ruby escrito em Rust, se encontrar que Asdf está retardando você.

Gerenciadores de Versão Apenas para Ruby

Se você pretende apenas desenvolver aplicações usando Ruby, escolha entre os quatro gerenciadores de versão apenas para Ruby: Chruby, Frum, Rbenv e RVM. As diferenças entre os quatro estão na velocidade, complexidade e em como cada um alterna versões do Ruby. Vamos analisar o mais antigo primeiro: RVM.

RVM

RVM foi o primeiro gerenciador de versões popular para Ruby. Ainda é mantido e amplamente utilizado. O RVM modifica o comando do sistema cd para definir variáveis de ambiente ao mudar de diretório. Para substituir o comando cd, o script de instalação do RVM altera o arquivo de configuração do shell (o arquivo ~/.zshrc em Macs mais recentes).

O RVM exibe corretamente as variáveis de ambiente para revelar a versão e o local do Ruby e dos gems, o que pode ajudar a diagnosticar problemas. No entanto, o RVM inclui recursos adicionais como gemsets. Os gemsets não são mais necessários, já que o Bundler foi adicionado ao Ruby core para gerenciar dependências de gems. A complexidade adicional não é necessária, então muitos desenvolvedores mudaram para um gerenciador de versões mais recente, como Rbenv, Chruby ou Frum.

Rbenv

Junto com o RVM, Rbenv tem sido por muito tempo o gerenciador de versões mais popular para Ruby. O Rbenv usa shims para interceptar comandos Ruby comuns. (O Asdf também usa shims.)

Após instalar o Rbenv com o Homebrew, você deve modificar seu arquivo ~/.zshrc para que os shims do Rbenv tenham prioridade sobre os comandos Ruby comuns. O shim chama o comando rbenv exec, que determina qual versão do Ruby usar antes de executar qualquer comando Ruby.

Shims têm dois inconvenientes. Primeiro, shims dificultam a resolução de problemas ao ocultar o comando real. Por exemplo, o comando which ruby mostra o shim do Rbenv, não a versão real do Ruby (você deve definir a variável de ambiente RBENV_DEBUG se quiser ver o comando real do Ruby). Segundo, um shim pode adicionar microssegundos de atraso à execução de um comando Ruby. (O Rbenv intervém toda vez que você executa um comando Ruby, ao contrário do RVM, que intervém apenas quando você muda de diretório.) Para desenvolvedores que percebem o atraso ou não gostam da ideia de shims, há o Chruby ou o Frum.

Chruby

Chruby não é tão conhecido quanto o RVM ou o Rbenv, mas é defendido por vários desenvolvedores Ruby proeminentes. Ao contrário do RVM, ele não substitui o comando cd. Ao contrário do Rbenv ou do Asdf, ele não intercepta comandos usando shims. Você precisará modificar seu arquivo ~/.zshrc para que o Chruby seja executado no seu ambiente de shell local. Não é necessário modificar seu $PATH, pois o Chruby faz isso por você, com base na versão do Ruby que você selecionou.

O Chruby também define determinadas variáveis de ambiente para o Ruby. Isso é tudo o que é necessário para o Chruby alternar entre versões do Ruby. Funciona bem para resolução de problemas com which. Usei o Chruby por vários anos e não tive problemas com ele. O Chruby é uma ótima escolha, mas você pode querer experimentar o Frum, o mais novo gerenciador de versões do Ruby.

Frum

Frum é escrito em Rust, uma ótima linguagem para execução rápida de software de sistema no terminal. Frum é novo (lançado no início de 2021). Ao contrário de Asdf, Chruby ou Rbenv, ele inclui um comando de instalação de Ruby integrado, então não é necessário nenhum programa extra para instalar o Ruby. O instalador é rápido e Frum não requer dependências (é um executável Rust all-in-one que você pode instalar com o Homebrew).

Após instalar o Frum, você deve modificar o seu arquivo ~/.zshrc para que o Frum seja executado no seu ambiente de shell local. Assim como os outros gerenciadores de versão, ele verifica se existe um arquivo .ruby-version em um diretório do projeto e, se não houver uma versão especificada para um projeto, ele usará a versão global do Ruby por padrão. Não há shims (ao contrário do Asdf ou Rbenv) e ele não substitui o comando cd (ao contrário do RVM). Embora seja novo, eu o recomendo porque é tudo-em-um e rápido.

Instalando um Gerenciador de Versão para Ruby

I’ve written a complete guide to installing Ruby on Mac. In the guide, I provide instructions for:

Se você deseja explorar o RVM ou Rbenv, consulte:

A Note about Docker

Se você mencionar gerenciadores de versões do Ruby, alguém provavelmente dirá: “Eu uso Docker.” Docker é uma ferramenta de virtualização que alguns desenvolvedores utilizam para gerenciamento de versões. O caso de uso principal do Docker é criar um servidor virtual reproduzível que contém uma versão configurada de qualquer dependência de software necessária para executar um aplicativo (linguagem, bancos de dados, filas de mensagens). Dessa forma, é ideal para criar uma versão “congelada” de um ambiente de desenvolvimento para implantação em um servidor.

Você também pode desenvolver localmente dentro de um contêiner, mas isso será mais lento, exigirá mais memória e adicionará complexidade de configuração em comparação a um gerenciador de versões. Para manter as coisas simples, evito o Docker para desenvolvimento local a menos que um aplicativo seja extremamente complexo.

Conclusão

Se você está trabalhando em vários projetos em Ruby, você não é apenas um usuário casual do Ruby. Certifique-se de instalar um ótimo gerenciador de versões em seu ambiente de desenvolvimento local.

I like Asdf because I develop in Ruby and JavaScript and Asdf gives me one version manager for both languages. However, Asdf uses shims (like Rbenv) so occasionally it’s slower than I like. I also find it annoying that Asdf hides the actual command from troubleshooting with the which command. If these drawbacks outweigh the convenience of managing multiple languages, I recommend using Frum to switch among your Ruby versions. Version managers should be simple and stay out of your way when you’re working.

Perguntas Frequentes (FAQs) sobre Gerenciadores de Versões Ruby para MacOS

Quais são as principais diferenças entre RVM e rbenv?

O RVM (Ruby Version Manager) e o rbenv são ambas ferramentas para gerenciar múltiplas versões do Ruby em seu sistema. A diferença chave está em sua abordagem. O RVM é mais rico em recursos e permite gerenciar gemsets – um conjunto de gems utilizadas para um aplicativo Ruby específico. Por outro lado, o rbenv é mais simples e se concentra apenas na troca de versões do Ruby. Ele não suporta gemsets, mas você pode alcançar funcionalidade semelhante utilizando um plugin chamado ruby-build.

Como eu instalo uma versão específica do Ruby usando o RVM?

Para instalar uma versão específica do Ruby usando o RVM, você pode usar o comando ‘rvm install’ seguido do número da versão. Por exemplo, para instalar o Ruby 2.6.3, você usaria o comando ‘rvm install 2.6.3’. Uma vez instalado, você pode alternar para esta versão usando o comando ‘rvm use’, como ‘rvm use 2.6.3’.

Posso usar tanto o RVM quanto o rbenv no mesmo sistema?

Embora seja tecnicamente possível ter tanto o RVM quanto o rbenv instalados no mesmo sistema, geralmente não é recomendado. Ambas as ferramentas modificam seu ambiente de shell e ter ambas pode levar a comportamentos inesperados. É melhor escolher uma baseada em suas necessidades e aderir a ela.

Como eu desinstalo uma versão do Ruby usando o rbenv?

Para desinstalar uma versão do Ruby usando o rbenv, você pode usar o comando ‘rbenv uninstall’ seguido do número da versão. Por exemplo, para desinstalar o Ruby 2.6.3, você usaria o comando ‘rbenv uninstall 2.6.3’.

Como eu defino uma versão padrão do Ruby com o RVM?

Para definir uma versão padrão do Ruby com o RVM, você pode usar o comando ‘rvm –default use’ seguido do número da versão. Por exemplo, para definir o Ruby 2.6.3 como padrão, você usaria o comando ‘rvm –default use 2.6.3’.

Como atualizo o rbenv e seus plugins?

Para atualizar o rbenv e seus plugins, você pode usar o git. Navegue até o diretório do rbenv no seu terminal (geralmente ‘~/.rbenv’) e execute ‘git pull’. Em seguida, navegue até cada diretório de plugin e faça o mesmo.

Posso usar o RVM ou rbenv com outras linguagens de programação?

O RVM e o rbenv são especificamente projetados para gerenciar versões do Ruby. Se você precisar gerenciar versões de outras linguagens de programação, pode querer olhar para ferramentas como pyenv para Python ou nvm para Node.js.

Como listo todas as versões do Ruby instaladas com o rbenv?

Para listar todas as versões do Ruby instaladas com o rbenv, você pode usar o comando ‘rbenv versions’. Isso mostrará uma lista de todas as versões do Ruby que o rbenv pode usar.

Como lido com dependências de gem com o RVM?

O RVM permite gerenciar dependências de gem através do uso de gemsets. Você pode criar um gemset com o comando ‘rvm gemset create’, alternar para ele com o comando ‘rvm gemset use’ e, em seguida, instalar as gems conforme necessário.

Como instalo uma nova versão do Ruby com o rbenv?

Para instalar uma nova versão do Ruby com o rbenv, você pode usar o comando ‘rbenv install’ seguido do número da versão. Por exemplo, para instalar o Ruby 2.6.3, você usaria o comando ‘rbenv install 2.6.3’.

Source:
https://www.sitepoint.com/ruby-version-managers-macos/