You can't really have rbenv and rvm coexist. With rvm, it overrides the 'gem' command, so that would make rbenv useless. If you want to use rbenv for both, you'd have to avoid using gemsets and instead use bundler to handle dependencies.
RVM is easier to install than Rbenv, RVM has more features than Rbenv, RVM includes a built-in Ruby installation mechanism while Rbenv does not.
rbenv vs. RVM. Both rbenv and RVM are Ruby version management tool. RVM is more resourceful but rbenv is lightweight which makes it a strong contender for RVM. RVM is used to manage and install different versions of Ruby and gemsets on system where Rbenv is a lightweight Ruby version management tool.
3.1 rbenv globalSets the global version of Ruby to be used in all shells by writing the version name to the ~/. rbenv/version file. This version can be overridden by a per-project . rbenv-version file, or by setting the RBENV_VERSION environment variable.
Short explanation: rbenv works by hooking into your environment's PATH
. The concept is simple, but the devil is in the details; full scoop below.
First, rbenv creates shims for all the commands (ruby
, irb
, rake
, gem
and so on) across all your installed versions of Ruby. This process is called rehashing. Every time you install a new version of Ruby or install a gem that provides a command, run rbenv rehash
to make sure any new commands are shimmed.
These shims live in a single directory (~/.rbenv/shims
by default). To use rbenv, you need only add the shims directory to the front of your PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Then any time you run ruby
from the command line, or run a script whose shebang reads #!/usr/bin/env ruby
, your operating system will find ~/.rbenv/shims/ruby
first and run it instead of any other ruby
executable you may have installed.
Each shim is a tiny Bash script that in turn runs rbenv exec
. So with rbenv in your path, irb
is equivalent to rbenv exec irb
, and ruby -e "puts 42"
is equivalent to rbenv exec ruby -e "puts 42"
.
The rbenv exec
command figures out what version of Ruby you want to use, then runs the corresponding command for that version. Here's how:
RBENV_VERSION
environment variable is set, its value determines the version of Ruby to use..rbenv-version
file, its contents are used to set the RBENV_VERSION
environment variable..rbenv-version
file in the current directory, rbenv searches each parent directory for an .rbenv-version
file until it hits the root of your filesystem. If one is found, its contents are used to set the RBENV_VERSION
environment variable.RBENV_VERSION
is still not set, rbenv tries to set it using the contents of the ~/.rbenv/version
file.(You can set a project-specific Ruby version with the rbenv local
command, which creates a .rbenv-version
file in the current directory. Similarly, the rbenv global
command modifies the ~/.rbenv/version
file.)
Armed with an RBENV_VERSION
environment variable, rbenv adds ~/.rbenv/versions/$RBENV_VERSION/bin
to the front of your PATH
, then execs the command and arguments passed to rbenv exec
. Voila!
For a thorough look at exactly what happens under the hood, try setting RBENV_DEBUG=1
and running a Ruby command. Every Bash command that rbenv runs will be written to your terminal.
Now, rbenv is just concerned with switching versions, but a thriving ecosystem of plugins will help you do everything from installing Ruby to setting up your environment, managing "gemsets" and even automating bundle exec
.
I am not quite sure what IRC support has to do with switching Ruby versions, and rbenv is designed to be simple and understandable enough not to require support. But should you ever need help, the issue tracker and Twitter are just a couple of clicks away.
Disclosure: I am the author of rbenv, ruby-build, and rbenv-vars.
I wrote an in-depth article: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
The basic difference is where the shell environment is changed:
Also, the thing about RVM is, it covers a lot more then just managing Rubies, it has a lot more than any other tool (there are others apart from RVM and rbenv: https://twitter.com/#!/mpapis/status/171714447910502401)
Do not forget about instant support you get on IRC in the "#rvm" channel on the Freenode servers.
So to summarise the excellent answers above, the main practical difference between RVM and rbenv is when the version of Ruby is selected.
rbenv:
rbenv adds a shim to the start of your path, a command with the same name as Ruby. When you type ruby
at a command line the shim is run instead (because it is also called "ruby" and comes first in the path). The shim looks for an environment variable or .rbenv_version
file to tell it which version of Ruby to delegate to.
RVM:
RVM allows you to set a version of Ruby directly by calling rvm use
. In addition, it also overrides the cd
system command. When you cd
into a folder that contains a .rvmrc
file, the code inside the .rvmrc
file is executed. This can be used to set a Ruby version, or anything else you fancy.
Other differences:
There are of course other differences. RVM has gemsets out of the box, while rbenv requires just a little more hacking (but not much). Both are functional solutions to the problem.
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before
Gives you approximately:
< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc
And it prepends:
$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin
to $PATH
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With