Reputation: 59
I need to run 2.5.3. I use brew to manage my ruby installation (as I couldn't get rvm to work on my machine). When I run
$ruby -v
I get
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
However when I attempt to update it using
brew upgrade ruby
I get
Error: ruby 2.6.1 already installed
Why is it so inconsistent on what ruby version I really have installed?
Upvotes: 5
Views: 23058
Reputation: 59
As a short term workaround, try not specifying a Ruby version in the gem file.
Upvotes: -1
Reputation: 658
You should be using a Ruby version manager to manage multiple versions of Ruby. I prefer using rbenv. Following are the steps to install it on a mac (they are explained in detail about what is being done and why; if you want a shortcut, try running all the commands in sequence but I'd still insist you read through the steps).
rbenv
Before proceeding with the actual installation, remember these points:
rbenv
in itself does not include the ability to install ruby versions. It only changes ruby version per directory. For installing rubies, you need to install the ruby-build tool (which is part of the rbenv project). It is the same for chruby as well which uses another tool to build ruby. EDIT (June 2021): It looks like rbenv installations now come with ruby-build and are capable of compiling ruby right on your machine. I will leave the answer as it is for so that it makes sense for someone on an older setup (or in case they revert that decision later).ruby-build
has to be installed as a plugin to rbenv.Run the following command to clone rbenv repo into .rbenv
directory in your home directory.
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Your system still does not know where rbenv is. Add it to your path by running:
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
To initialize rbenv so that it can help you with changing rubies when you change directories, run this:
~/.rbenv/bin/rbenv init
This should tell you something like this:
# Load rbenv automatically by appending
# the following to ~/.bash_profile:
eval "$(rbenv init -)"
So run this:
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
By this point rbenv should be installed. When you run rbenv
on the command line, you should get something like this:
$ rbenv
rbenv 1.1.1-39-g59785f6
Usage: rbenv <command> [<args>]
Some useful rbenv commands are:
commands List all available rbenv commands
local Set or show the local application-specific Ruby version
global Set or show the global Ruby version
shell Set or show the shell-specific Ruby version
rehash Rehash rbenv shims (run this after installing executables)
version Show the current Ruby version and its origin
versions List all Ruby versions available to rbenv
which Display the full path to an executable
whence List all Ruby versions that contain the given executable
See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme
NOTE: If you get a warning saying that rbenv is not installed, just run source ~/.bash_profile
. That will rerun the ~/.bash_profile
script and get rbenv in your path. You should be able to run rbenv
after that without trouble.
Do notice that rbenv does not give an option to install or uninstall rubies yet. For this we need to install ruby-build.
We need to add the ruby-build package as a rbenv plugin so that we can type rbenv install <ruby version>
to install rubies. All you need to do is to create the plugins directory and checkout the git repo for ruby-build in the plugins directory. Run the following:
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
Run rbenv without any arguments on the terminal should now show the install and uninstall commands being available. Something like this:
$ rbenv
rbenv 1.1.1-39-g59785f6
Usage: rbenv <command> [<args>]
Some useful rbenv commands are:
commands List all available rbenv commands
local Set or show the local application-specific Ruby version
global Set or show the global Ruby version
shell Set or show the shell-specific Ruby version
install Install a Ruby version using ruby-build
uninstall Uninstall a specific Ruby version
rehash Rehash rbenv shims (run this after installing executables)
version Show the current Ruby version and its origin
versions List all Ruby versions available to rbenv
which Display the full path to an executable
whence List all Ruby versions that contain the given executable
See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme
If you see that output, your rbenv is installed properly.
To install ruby 2.5.3, you could run (wait, don't run it yet):
rbenv install 2.5.3
It should output a few lines, take some time and then tell you that version 2.5.3 was installed. However, there is a problem - if the installation fails, especially during compilation, sometimes, the terminal gets stuck and there is no output on the terminal. It just appears to be installing for a long time (forever). To get more info about what is happening, run the following:
rbenv install -f -v 2.5.3
The -f
argument tells rbenv to force-install the given version. So if it is already installed, rbenv will re-install (basically overwrite) the given version. So if an installation failed, -f
will make sure of the installation.
The -v
argument tells rbenv to output verbose messages. So everything that ruby-build does (including the compilation process) will be shown to you. Don't be afraid by the word compilation here. It normally compiles fine without troubles and does not alter your system ruby (the one installed with sudo apt install ruby
on Linux or the one you get by default on macOS) whether it succeeds or fails.
Once the installation succeeds, you can run the command below to check which versions are installed (output included in the snippet below):
$ rbenv versions
system
* 2.5.3 (set by /home/ubuntu/.rbenv/version)
Note: On mac, the newly installed ruby will have a different path.
The one with the *
in front of it is the one which is active right now. If you run which ruby
, you should get a path with a ruby shim. If you are curious, read the rbenv documentation to know what shims are, though you wouldn't have to worry about them.
$ which ruby
/home/ubuntu/.rbenv/shims/ruby
rbenv is a cool thing to have but to keep writing rbenv shell 2.5.3
and rbenv shell 2.4.5
every single time is a problem. What you should instead do is set a version of ruby for the directory and forget about rbenv.
You can just create a file named .ruby-version
containing one line - the version number of ruby you want to use for all ruby scripts within this directory (and subdirectories). Just cd to the required directory and run:
echo "2.5.3" > .ruby-version
All ruby scripts within that directory and subdirectories will then use version 2.5.3.
Upvotes: 20