Using Node Version Manager (NVM) to Manage Multiple Node.js Versions

Node Version Manager (NVM) is a neat little bash script that allows you to manage multiple versions of Node.js on the same box. A version manager really helps to test our applications under different versions of the related software.

Installation

Just clone the git repository from github into ~/.nvm or any other folder of your wish.

[bash]
$ git clone git://github.com/creationix/nvm.git ~/.nvm
[/bash]

To activate it, source it from the bash shell using source or .

[bash]
$ . ~/.nvm/nvm.sh
[/bash]

If you want to know what the . does try one of these commands –

[bash]
$ help source
$ help .
[/bash]

It basically reads and executes all the commands from the filename passed to it (~/.nvm/nvm.sh in our case), in the current shell.

To make sure the nvm command is available in your shell, add the source line to your profile, which is ~/.bash_profile or ~/.profile. These profiles get read on login, hence it’ll automatically source the nvm script. For non-login shells (for example terminals fired up from your GUI environment) you’ll need to source from ~/.bashrc.

For a quicker installation, just download and execute the install script provided via cURL or wget –

[bash]
$ curl https://raw.github.com/creationix/nvm/master/install.sh | sh
.. or ..
$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh
[/bash]

These commands will clone the git repository to ~/.nvm and put the source line to your profile (~/.bash_profile if found else ~/.profile).

Usage

Using it is super duper simple, let’s see how –

[bash]
# To check what versions can be installed
$ nvm ls-remote

# To install:
# nvm install [version]
$ nvm install 0.10.0

# To check what versions are installed
$ nvm ls

# To use the installed version
$ nvm use 0.10.0
# .. or just run the node repl with that version
$ nvm run 0.10.0

# To remove/uninstall
$ nvm uninstall 0.10.0
[/bash]

When you install node v0.10.0, it get’s installed in ~/.nvm/v0.10.0 and the new node binary residing in ~/.nvm/v0.10.0/bin gets added to the PATH environment variable.

[bash]
$ node -v
v0.10.3

$ nvm install 0.10.0
######################################################################## 100.0%
Now using node v0.10.0

$ node -v
v0.10.0

$ ls ~/.nvm/v0.10.0/
bin ChangeLog lib LICENSE README.md share

$ ls ~/.nvm/v0.10.0/bin/
node npm

$ echo $PATH
/home/rishabh/.nvm/v0.10.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[/bash]

This is what you’d do to restore your path and get back to the original node installation (if any) –

[bash]
# Installed via nvm
$ node -v
v0.10.0

$ nvm deactivate
/home/rishabh/.nvm/*/bin removed from $PATH
/home/rishabh/.nvm/*/share/man removed from $MANPATH

# Initial node installation
$ node -v
v0.10.3

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[/bash]

The best part of nvm is that, you can set a default version of Node to be used by setting the alias default.

[bash]
# nvm alias <name> <version>
# Set node v0.8.22 to use by default
$ nvm alias default 0.8.22
[/bash]

Basically nvm alias is used to set a name pointing to a particular node version.

[bash]
# More aliases?
$ nvm alias ten 0.10.0
ten -> 0.10.0 (-> v0.10.0)

$ nvm alias
default -> 0.8.22 (-> v0.8.22)
ten -> 0.10.0 (-> v0.10.0)

$ nvm use ten
Now using node v0.10.0
[/bash]

Auto Command Completion

If you type nvm and hit the tab key twice, it won’t list related commands/options. To activate this you’ll need to source ~/.nvm/bash_completion right after the sourcing of the nvm.sh file (as shown above).

This is what needs to be added –

[bash]
[[ -r $NVM_DIR/bash_completion ]] && . $NVM_DIR/bash_completion
[/bash]

Checks whether the file is readable or not, if yes then source it. Now when you hit tab key twice –

[bash]
$ nvm [tab][tab]
alias deactivate list ls-remote uninstall
clear-cache help list-remote run use
copy-packages install ls unalias version

$ nvm use [tab][tab]
default ten v0.10.0 v0.8.22

# .. and so on!
[/bash]

Notes

Technically nvm is not a script executable file. It’s a bash function. You can read the contents of ~/.nvm/nvm.sh.

Conclusion

It’s awesome! Really helpful especially when you’re trying out a new version of Node and your app suddenly breaks due to incompatibilities. Your best bet is to rollback to the older version and nvm makes this process dead simple.

Author: Rishabh

Rishabh is a full stack web and mobile developer from India. Follow me on Twitter.