80 lines
2.3 KiB
Markdown
80 lines
2.3 KiB
Markdown
---
|
|
title: Managing Ruby versions
|
|
---
|
|
|
|
## Ruby has changed over time
|
|
|
|
Ruby was been in constant development since the 1990s, and like many languages,
|
|
there have been syntax changes across versions, so it is important to be clear
|
|
about which Ruby version your code expects.
|
|
|
|
Probably the most visible change came with Ruby 1.9; previously, we wrote
|
|
hashes like this:
|
|
|
|
```ruby
|
|
{ :one => 1, :two => 2, :three => 3 }
|
|
```
|
|
|
|
This use of the 'hashrocket' operator (`=>`) was so common, that Ruby 1.9
|
|
provided a shorthand:
|
|
|
|
```
|
|
{ one: 1, two: 2, three: 3 }
|
|
```
|
|
|
|
This older code run on any version, but the newer syntax will only run on Ruby 1.9+.
|
|
|
|
## How does this cause problems?
|
|
|
|
For example, you might have decided to use a Gem which internally relies on
|
|
Ruby 1.9 features; this means that your project now also relies on Ruby 1.9
|
|
features.
|
|
|
|
If you don't specify which version of Ruby your project needs, it can be very
|
|
confusing when code works on one machine, but not another.
|
|
|
|
As with most languages, it's considered good practice to specify the version of
|
|
Ruby that your code expects. This makes it much easier to manage multiple
|
|
projects on your development machine, each expecting a different version of
|
|
Ruby.
|
|
|
|
## How do I specify my Ruby version?
|
|
|
|
There are a couple of tools which are popular for this, but both have agreed to
|
|
share a common file. Many Ruby (or Rails) projects will include a simple
|
|
`.ruby-version` file, which simply specifies a version number, _eg_:
|
|
|
|
```
|
|
2.4.2
|
|
```
|
|
|
|
Popular tools to help you manage your Ruby version are:
|
|
|
|
* [Ruby Version Manager (RVM)](https://rvm.io)
|
|
* [rbenv](https://github.com/rbenv/rbenv)
|
|
|
|
Let's look at RVM.
|
|
|
|
### Using RVM
|
|
|
|
RVM is typically installed ([link](https://rvm.io)) on a Linux, Unix or MacOS
|
|
machine, and is very convenient as it hooks into the `cd` (`c`hange `d`irectory)
|
|
command so when you move to a new project, your `.ruby-version` is read
|
|
automatically, and you're automatically switched to the correct version of Ruby
|
|
before you start working.
|
|
|
|
For example, you might have this sequence:
|
|
|
|
```shell
|
|
% cd ~/projects/older-project
|
|
% ruby --version
|
|
|
|
ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-darwin16]
|
|
|
|
% cd ~/projects/newer-project
|
|
% ruby --version
|
|
|
|
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
|
|
```
|
|
(These examples are from a MacOS machine)
|