Breve explicação: o rbenv funciona conectando-se ao seu ambiente PATH
. O conceito é simples, mas o diabo está nos detalhes; colher completa abaixo.
Primeiro, rbenv cria calços para todos os comandos ( ruby
, irb
, rake
, gem
e assim por diante) em todas as suas versões instaladas do Ruby. Esse processo é chamado de rehashing . Toda vez que você instalar uma nova versão do Ruby ou instalar uma jóia que fornece um comando, execute rbenv rehash
para garantir que quaisquer novos comandos sejam shimmed.
Esses shims residem em um único diretório ( ~/.rbenv/shims
por padrão). Para usar o rbenv, você só precisa adicionar o diretório shims na frente do seu PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Então, sempre que você executar a ruby
partir da linha de comando ou executar um script cujo shebang lê #!/usr/bin/env ruby
, seu sistema operacional o localizará ~/.rbenv/shims/ruby
primeiro e o executará em vez de qualquer outro ruby
executável que você possa ter instalado.
Cada shim é um pequeno script do Bash que, por sua vez, é executado rbenv exec
. Assim, com rbenv em seu caminho, irb
é equivalente a rbenv exec irb
, e ruby -e "puts 42"
é equivalente a rbenv exec ruby -e "puts 42"
.
O rbenv exec
comando descobre qual versão do Ruby você deseja usar e, em seguida, executa o comando correspondente para essa versão. Aqui está como:
- Se o
RBENV_VERSION
variável de ambiente estiver definida, seu valor determinará a versão do Ruby a ser usada.
- Se o diretório de trabalho atual tiver um
.rbenv-version
arquivo, seu conteúdo será usado para definir oRBENV_VERSION
variável de ambiente.
- Se não houver
.rbenv-version
arquivo no diretório atual, o rbenv procurará em cada diretório pai por um .rbenv-version
arquivo até atingir a raiz do seu sistema de arquivos. Se for encontrado, seu conteúdo é usado para definir oRBENV_VERSION
variável de ambiente.
- Se
RBENV_VERSION
ainda não estiver definido, o rbenv tenta defini-lo usando o conteúdo do ~/.rbenv/version
arquivo.
- Se nenhuma versão for especificada em nenhum lugar, o rbenv assume que você deseja usar o Ruby "system" - ou seja, qualquer versão seria executada se o rbenv não estivesse no seu caminho.
(Você pode definir uma versão Ruby específica do projeto com o rbenv local
comando, que cria um .rbenv-version
arquivo no diretório atual. Da mesma forma, o rbenv global
comando modifica o~/.rbenv/version
arquivo.)
Armado com uma RBENV_VERSION
variável de ambiente, o rbenv adiciona ~/.rbenv/versions/$RBENV_VERSION/bin
à sua frente PATH
e depois executa o comando e os argumentos passados para rbenv exec
. Voila!
Para uma visão completa do que exatamente acontece sob o capô, tente configurar RBENV_DEBUG=1
e executar um comando Ruby. Todo comando Bash executado pelo rbenv será gravado no seu terminal.
Agora, o rbenv se preocupa apenas com a alternância de versões, mas um ecossistema próspero de plugins o ajudará a fazer tudo, desde a instalação do Ruby até a configuração do seu ambiente , o gerenciamento de "gemsets" e até a automaçãobundle exec
.
Não tenho muita certeza do que o suporte ao IRC tem a ver com a troca de versões do Ruby, e o rbenv foi projetado para ser simples e compreensível o suficiente para não exigir suporte. Mas se você precisar de ajuda, o rastreador de problemas e o Twitter estão a apenas alguns cliques de distância.
Divulgação: Eu sou o autor de rbenv, ruby-build e rbenv-vars.
Eu escrevi um artigo detalhado: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
A diferença básica é onde o ambiente do shell é alterado:
Além disso, o RVM abrange muito mais do que apenas gerenciar Rubies, possui muito mais do que qualquer outra ferramenta (existem outras além do RVM e do rbenv: https://twitter.com/#!/mpapis/ status / 171714447910502401 )
Não se esqueça do suporte instantâneo obtido no IRC no canal "#rvm" nos servidores Freenode.
fonte
Então, para resumir as excelentes respostas acima, a principal diferença prática entre RVM e rbenv é quando a versão do Ruby é selecionada.
rbenv:
O rbenv adiciona um calço ao início do seu caminho, um comando com o mesmo nome que Ruby. Quando você digita
ruby
em uma linha de comando, o shim é executado (porque também é chamado de "ruby" e é o primeiro no caminho). O shim procura uma variável de ambiente ou.rbenv_version
arquivo para informar em qual versão do Ruby delegar.RVM:
O RVM permite que você defina uma versão do Ruby diretamente ligando
rvm use
. Além disso, ele também substitui ocd
comando do sistema. Quando você estácd
em uma pasta que contém um.rvmrc
arquivo, o código dentro do.rvmrc
arquivo é executado. Isso pode ser usado para definir uma versão Ruby ou qualquer outra coisa que você gosta.Outras diferenças:
Claro que existem outras diferenças. O RVM possui gemsets prontos para uso, enquanto o rbenv requer um pouco mais de hackers (mas não muito). Ambos são soluções funcionais para o problema.
fonte
A principal diferença parece ser quando e como o ruby é alternado . Ruby é alternado:
O RVM depende do
cd
comando modificado e da seleção manual de Ruby byrvm use
. O rbenv usa wrappers ou "shims" para todos os comandos básicos do ruby como o mecanismo padrão para selecionar o ruby. O RVM cria wrappers para ferramentas básicas de linha de comando, como gem, rake, ruby também. Eles são usados, por exemplo, no CronJobs (consulte http://rvm.io/integration/cron/ ), mas não são o mecanismo padrão para alternar a versão do Ruby.Portanto, os dois métodos selecionam "automaticamente" a versão correta do Ruby, substituindo comandos e usando wrappers. O rvm substitui os comandos do shell como o cd. O rbenv substitui todos os comandos básicos do ruby, como ruby, irb, rake e gem.
fonte
Fornece aproximadamente:
E acrescenta:
para
$PATH
fonte