How to install nvm outside the user directory

8 min. read

A bit of context

You can install node in Ubuntu with the apt-get manager (or apt from 16.04 on), but it will give you an old version of node . Also, it will install node in a directory that needs root permissions. This means that all your future npm packages will be installed as root.

Node packages are scripts made by who knows whom, running freely in your system. Because anybody can create and publish a node module! That's why Isaac Z. Schlueter, the founder and CEO of npm, has been discouraging people from installing node as root for this and other reasons.

The other thing that you don't get with node (well, now you do!) is being able to install different versions of node alongside each other. Node has npm to handle package installation and package.json to handle package versions, but there was nothing to handle node versions. If you ever used Ruby, you've been spoiled. Ruby has several version managers to choose from (I use rbenv) as well as a convenient way to handle gem versions (mainly through bundler). So I did some research and I discovered that nvm exists for node. It allows you to install several different versions of node and switch from one to the other depending on your project's requirements, very easily. So I decided that I had to give it a try.

nvm

If you read the README in the official repository, you will see that there are several ways you can install it, including manually. The easiest way and the one you will find in every tutorial is just using curl and running the install.sh file:


curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash

Boom. Done. BUT: this will install nvm in your home directory, creating an ~/.nvm folder inside of which the different node versions will be installed, in a very similar way as how rbenv works. It's a clean install, to uninstall you just have to remove that folder.

However, I didn't want to install it in my home directory, but in /opt. The path to the home directory is kind of hardcoded in the install script, but you can jump over it if you set the NVM_DIR variable in your enviroment before doing the installation. But then the installation process is a bit different.

Installing in a different directory

I decided to choose the manual install, which is easy and keeps you updated because it's just a git repository that you can git pull at anytime. This is what I did:

Download code from official repo

Use a directory that you don't have to edit with root persmissions. I created an nvm directory inside of /opt that is owned by my user. Following the official instructions for a manual installation:


git clone git@github.com:creationix/nvm.git /opt/nvm
cd nvm
git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" origin`

In this repo you will find the install.sh and nvm.sh files. If you want to do the usual installation (in the home folder) just run install.sh. If not, keep reading.

Install in another folder

I want to install nvm in the /opt/nvm folder that I just cloned, so:


export NVM_DIR=/opt/nvm
source $NVM_DIR/nvm.sh
nvm

And that's it! You have installed nvm.

Having the cloned repo is also cool because it's all written in bash, so you can contribute bugfixes! and it also has a nice test suite (I didn't know there was a test framework for bash but I am nicely surprised!)

Make it permanent

You have been doing this in the current terminal window, so if you close it, the definition of NVM_DIR will be lost.

Fix that by adding this to your .bashrc:


# nvm
export NVM_DIR=/opt/nvm
[ -s "$NVM_DIR/nvm.sh" ] &:&: . "$NVM_DIR/nvm.sh"

Uninstall

If you want to uninstall it, you just have to remove the .nvm folder inside /opt.

node

So this section is what we are here for. We wanted to install several versions of node and be able to switch between them easily. The documentation on how to use nvm to manage node installations is in the official README.

At first, if you ask nvm for the available node packages, you will get:


$ nvm ls
           N/A
node -> stable (-> N/A) (default)
iojs -> N/A (default)

So I decided to choose the first:


$ nvm install node

This will add these three folders to the directory.


$ ls -al /opt/nvm
total 20
drwxrwxr-x 5 ubuntu ubuntu 4096 Mar 17 22:07 .
drwxr-xr-x 6 ubuntu ubuntu 4096 Mar 17 21:01 ..
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 17 22:01 alias
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 17 22:07 .cache
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 17 22:07 versions
...etc

Node versions will be installed in the /opt/nvm/versions directory. Sounds a lot like rbenv!


$ which node
/opt/nvm/versions/node/v7.7.3/bin/node

As you can see, we have installed the latest stable version of node at the moment of writing this post, which is v7.7.3.

Comments