RVM Overview and Installation
In someone’s first few hours as a Ruby on Rails developer, they will likely be encouraged to install Ruby Version Manager (commonly known as RVM). RVM is a free, powerful tool for creating and easily moving between Ruby and Ruby Gem combinations.
It’s important for the newb to understand that you want to get RVM configured correctly before running rails new
. It’s your RVM settings that will control just what kind of Ruby on Rails app gets generated. Confused? No problem, just keep reading.
As per the RVM installation instructions, by simply entering the below short statement into your command line, you can begin unlocking the power of Ruby and Rails!
$ \curl -L https://get.rvm.io | bash -s stable --rails
Let’s talk about what this is doing. Besides installing the RVM tool itself, this command will also install the newest, stable version of both Ruby and Rails.
That’s great right? The newest, stable version is probably what any new Rails dev wants to be running right? Probably. Let me explain about why I hesitate.
Rails Is a Moving Target
As Rails issues are continuously being found and resolved, the open source code changes over time. The Rails 3.2.13 gem (yes, Rails is just a gem) was released in March 2013 and the Rails 4.0.0 gem released 3 months later in June 2013.
As Rails evolves, syntax that worked in a previous version may no longer work in a newer version. For this reason, the Rails Guide’s own guidance states:
“Before attempting to upgrade an existing application, you should be sure you have a good reason to upgrade.”
The main point for the newb is that pro-actively understanding and choosing which version of Rails they will use to build any app is an important decision.
Note: The syntax retirement described above is specific to Rails (not Ruby). As such, it’s unlikely a newb will have a reason to run an older version of Ruby. However, it is plausible a newb may have reason to run an older version of Rails (as explained below).
Explain It To Me Like I’m 3 Years Old
In addition to RVM, another common ingredient in a new Rails developer’s kitchen will be one of the great tutorials like Ruby on Rails Tutorial (Hartl) or Rails in Action (Biggs, Katz)
. These cookbooks have multiple editions as they are generally refreshed when Rails is refreshed. If a newb is using a tutorial predicated on a different (possibly earlier) version of Rails than what RVM has installed by default, headaches will ensue.
One more probable Rails newb scenario is installing a newer version of either Ruby or Rails when one is released after RVM was originally installed. Both of these scenarios will be addressed below.
This Sounds Like It Could Be Me. How Do I Avoid Headaches?
It really quite easy, and in fact this is what RVM was built to do! But before we dive into more command line stuff, let’s revisit the following statement,
“RVM is a free, powerful tool for creating and easily moving between Ruby and Ruby Gem combinations.”
You can think of RVM as your food pantry for Ruby and Ruby Gems. Maybe you’re feeling old school and want a little Ruby 2.0.0 with a dash of Rails 3.2.13. Or maybe you’re feeling modern and want to run Ruby 2.0.0 with a sprinkle of Rails 4.0.0. No matter the combination, RVM can have these ingredients ready to grab off the shelf and even mix together with a few simple keystrokes before you run
rails new
.
Filling Your Pantry with Rubies
Note: It’s unlikely a newb will have a reason to run an older version of Ruby. However, the following instructions are provided for completeness and apply for newbs wanting to install a newer version of Ruby (if one has been released since the original RVM install).
So you’ve got the defaults RVM gave you, but let’s put some other flavors of Ruby into our pantry. Getting additional versions of Ruby is easy enough. Simply drop the below into your terminal.
$ rvm install ruby_version_here
Here’s an example:
$ rvm install 1.9.3
Depending on your needs, feel free to change “1.9.3” for any other (possibly newer) version of Ruby desired. For a list of all available versions, run:
$ rvm list known
Now to see all locally installed versions of Ruby on your machine go ahead and run:
$ rvm list
This returns a nice list of Ruby versions on your machine – as well as indicators of the “default” version and the “current” version.
If you want to change your current version (which you might want to do before running rails new
, you can simply enter:
$ rvm use full_ruby_version_name
Here’s an example:
$ rvm use ruby-1.9.3-p392
Note: It’s unlikely a newb will have a reason to run an older version of Ruby. However, a newb may decide to run a newer version of Ruby should one be released after the newb’s original RVM installation.
Navigating and Naming Gemsets in RVM
Okay, so we’ve got multiple Ruby versions that we can quickly move between. But what about Rails? As already stated, Rails is a gem and RVM stores gems in groups – called “gemsets”.
Gemsets in RVM are isolated in that they are only available to a single version of Ruby (this is a common area of confusion for newbs). When a version of Ruby is installed via RVM, 2 associated (empty) gemsets will be created simultaneously. One is called “global” and one is called “default”.
Global Gemset: Any gems installed into the “global” gemset will be included whenever rails new
is run while the associated version of Ruby is active or in use.
Default or User Generated Gemsets: Gems installed into “default” (or a user created gemset), will only be included when rails new
is run if that gemset is active or in use.
For example, if you want to be able to run Rails 3.2.13 and Rails 4.0.0 with Ruby 2.0.0, you’ll need 2 separate gemsets and you’ll need to install a different version of Rails into each one.
To bring these points home, possibly a visual will help. Here it is.
Note! I recently released an iPhone app and would appreciate it if you would give it a try. It’s free and called smoov. smoov is a text messaging assistant for gents.
You can download it here or search for it by name in the App Store.
Similar to seeing all locally available Ruby versions, we can see all locally available gemsets (associated with the currently active version of Ruby) via the below command.
$ rvm gemset list
Moving on, to see all gems in the current gemset, just run:
$ gem list
If you want to see what gems are inside of a different gemset, simply move to that gemset with:
$ rvm gemset use gemset_name
For example:
$ rvm gemset use default
or
$ rvm gemset use global
and then,
$ gem list
Great, so we’ve got multiple versions of Ruby, multiple gemsets, and understand the gems inside those gem sets.
A Note About Gemset Naming:
A common area of confusion for newbs with multliple versions of Ruby is that they have multiple gemsets named “global” and “default”. $ rvm gemset list
will return the “global”, “default”, and any other gemsets subordinate to that specific Ruby instance. If the newb changes their active Ruby version with $ rvm use full_ruby_version_name
and then reruns $ rvm gemset list
, they will again see “global” and “default” gemsets, but these are not the same gemsets seen just moments earlier.
Due to this approach by RVM, I suggest including the Ruby version number when creating new gemsets. For example: rvm gemset create ruby2rails3
or rvm gemset create ruby2rails4
.
Filling Your Pantry with Ruby Gems
So we know what we have for existing gemsets and their included gems, what if we want to create a new gemset? No problem, first just make sure you are “using” the version of Ruby that you want the gemset to be associated with. We already learned how to navigate between Ruby versions with:
$ rvm use full_ruby_version_name
Here’s an example:
$ rvm use ruby-2.0.0-p0
Now just tell RVM to create a new gemset and what to name it, using:
$ rvm gemset create my_new_gemset
Here’s two examples:
$ gem gemset create ruby2rails3
or $ gem gemset create ruby2rails4
Next, we need to “use” the newly created gemset by running:
$ rvm gemset use my_new_gemset
or in our example
$ rvm gemset use ruby2rails3
Once we are “using” or inside the target gemset, we can begin installing gems to our hearts content with:
$ gem install gem_name
Here’s an example:
$ gem install rails -v 3.2.13
Finally, to see a complete list of all Rails releases, go to RubyGems.org. Another quick way to get educated on great gems, is to check out Easy Does IT: Top 10 Gems for Rails Newbs.
Changing Default Settings
As stated earlier, RVM is going to set your initial Ruby and Gemset defaults to the latest, stable version of Ruby and Rails. If you woud like to change these default settings you can do so with:
$ rvm use ruby_version@gemset_name --default
Here’s an example:
$ rvm use ruby-2.0.0-p0@ruby2rails3 --default
Summary
All if this information is shared so a new Rails developer can consider and have confidence in knowing what version of Rails they want to be use when running the rails new
command.
Conceptually, the newb should now be able to easily:
- See all locally install versions of Ruby with:
$ rvm list
- Move between locally installed versions of Ruby with:
$ rvm use ruby_version_here
- Install additional versions of Ruby with:
$ rvm install ruby_version_here
- See all locally existing gemsets for a specific version of Ruby with:
$ rvm gemset list
- Move between gemsets with:
$ rvm gemset use gemset_name_here
- Create new gemsets with:
$ rvm gemset create my_new_gemset
- Install new gems in the current gemset with:
$ gem install gem_name_here
- Change their default Ruby and Gemset with:
$ rvm use ruby_version@gemset_name --default
Full disclosure: This was the first blog post I’ve written as a Rails dev. In short, I’m a newb too.
If you’ve found this post useful, consider reading my other newb-centric posts:
- After the Install: Scenario-Based RVM Best Practices
- Easy Does IT: Top 10 Gems for Rails Newbs
- Reading Rails 4: MVC and Scaffolding for Rails Newbs
- Security is a Feature: 9 Newb-Friendly Steps to Securing Your Rails Apps
- Embedding Devise Forms in Twitter Bootstrap Modals
I welcome your comments and feedback.
Hi Mike! Excellent post. I hadn’t ever really thought that much about RVM, I just followed the internet directions and forgot about it. : ) Now I feel smarter.
Calico – I was in the same boat for some time. Thanks so much for reading and commenting. I’m very glad it was useful to you 🙂
I just had to install many things for a new computer, and this definitely helped. Thanks for writing this Mike! #bookMarked
Gonzo – so glad it helped. #GoDawgs
How do I update my zsh if I am getting the error message, ” WARNING: In case of using Zsh, version 4.3.12 / 5.0.0+ is recommended, you have 4.3.11, errors to be expected.” when installing RVM
Hi Jayant – please see this thread https://github.com/wayneeseguin/rvm/issues/2029.
Awesome article. Creating our custom gemsets seems pretty interesting since ruby and especially rails are fast evolving technologies. Thanks and keep up the good work.
Hi Chedli – thank you for reading and commenting. I’m glad you found the post useful. If you didn’t notice, I recently published a follow-up post titled “After the Install: Scenario-Based RVM Best Practices” which addresses custom gemsets a bit further. https://strandcode.com/2013/08/26/after-the-install-scenario-based-rvm-best-practices/
Really helpful post – thanks so much for making this. I’m currently working through Hartl’s Rails Tutorial and this was a lifesaver. Really filled in the gaps in his tutorial about RVM. Cheers!