Using rbenv to Manage Rubies and Gems

Laila Winner

We recently switched from RVM to rbenv for managing Ruby versions.

“Make each program do one thing well.” - Tenet #2 of The UNIX Philosophy

Why consider switching to rbenv

The UNIX philosophy espouses an approach to software in which small, sharp tools are designed and used to address discrete needs. By this standard, RVM simply does too much. RVM is responsible not only for changing Ruby versions, but for installing rubies and managing gemsets, as well.

Breaking these responsibilities apart and selecting a tool for each job is a good alternative to using RVM. Along with rbenv, we’re using Bundler to manage gems (replacing gemsets) and ruby-build to install rubies.

How our rbenv workflow works

  • Uses ruby-build to install Rubies
  • Relies on Bundler and its’ binstubs to manage gems
  • Uses shims to handle executable gems
  • Updates shims upon receipt of the rbenv rehash command after new Ruby executables are installed (rehashing can be automated with the gem rehash plugin)
  • Installs everything to ~/.rbenv/

How to switch from RVM to rbenv

Check out our laptop script to see our process for installing rbenv, or follow the steps below.

If you’re a tmux user, be sure to kill all your tmux sessions before installing rbenv to prevent RVM from polluting your environment.

In your root directory, remove RVM from your system:

rvm implode

Restart your shell to ensure you’re beginning your rbenv installation in a clean environment:

exec $SHELL -l

Next, install rbenv using homebrew:

brew update
brew install rbenv

Configure your bash or zsh profile:

echo 'eval "$(rbenv init -)"' >> ~/.zlogin
source ~/.zlogin

Install ruby-build and rbenv rehash gem using homebrew:

brew install rbenv-gem-rehash
brew install ruby-build

Install your preferred version of Ruby and set it as the global default:

rbenv install 2.0.0-p353
rbenv global 2.0.0-p353

Update to the latest Rubygems version:

gem update --system

Install gems critical to Rails development, e.g.

gem install bundler foreman pg rails thin --no-rdoc --no-ri

You can set project-specific Ruby and gem versions by running the rbenv local command within your project directory:

rbenv local 2.0.0-p247

If you follow the steps above and find you’re having issues with rbenv, check your echo $PATH. Most likely you’re not seeing the appropriate ~/.rbenv dir.

If so, you either haven’t added the init to your zsh profile, or something else is mangling the path.

Extras

  • To ease the transition, install the use plugin, which lets you run RVM-style commands with rbenv
  • rbenv-binstubs is a handy plugin that allows you to omit bundle exec when you run commands