Nodejs the proper way without using sudo
Update existing proper installation
Run these two commands as is:
npm i -g n N_PREFIX=$HOME/.local n stable
If it is the first time you are installing this, simply download the LTS from nodejs.org
~/.local dir, which is used by many other programs (so it should already exist).
cp -fR ~/Downloads/node-v12.13.1-linux-x64/* ~/.local/
.local/bin dir to your exports path. To do so add the following line to
Now all your global modules should live inside
Updating to latest version (if you changed the global node modules dir)
You should not sudo too much on programs you do not know.
That should have convinced you that the only way to update node is through a node module called n.
You probably have a version of node lying around. And you have installed npm. Npm should be installed properly without the
sudo part. To do so you have changed the global node modules installation directory. It should be something like
$HOME/.node_modules_global. You should also have added it to $PATH in your .bashrc. This way you can run the binaries.
Now if you want to update node the wrongly suggested way is to use
sudo npm i -g n #don't use sudo!
We said no
sudo! The correct way is to simply run the same command without
npm i -g n
This has the effect of installing the
n module in your
$HOME/.node_modules_global. Since it is in the path, you can now proceed to the next step, which is to update
(following is a wrong way, it will give you an error)
n stable installing : node-v12.13.1 mkdir : /usr/local/n/versions/node/12.13.1 mkdir: cannot create directory ‘/usr/local/n’: Permission denied Error: sudo required (or change ownership, or define N_PREFIX)
The solution is NOT to change ownership of
/usr/local/n, because there are many other dirs that
n wants to write to like these:
(following is a failed attempt by
sudo mkdir /usr/local/n && chown $(WHOAMI) /usr/local/n, if we run
n stable again it will show you all the dirs
n wants to write to, which of course we DON'T want to
n stable installing : node-v12.13.1 mkdir : /usr/local/n/versions/node/12.13.1 fetch : https://nodejs.org/dist/v12.13.1/node-v12.13.1-linux-x64.tar.gz cp: cannot create directory '/usr/local/lib/node_modules': Permission den ied cp: cannot create regular file '/usr/local/bin/node': Permission denied cp: cannot create symbolic link '/usr/local/bin/npm': Permission denied cp: cannot create symbolic link '/usr/local/bin/npx': Permission denied cp: cannot create directory '/usr/local/include/node': Permission denied cp: cannot create directory '/usr/local/share/systemtap': Permission denied cp: cannot create directory '/usr/local/share/doc': Permission denied cp: cannot create directory '/usr/local/share/man/man1': Permission denied /home/g/.node_modules_global/bin/n: line 569: /usr/local/bin/node: No such file or directory
The true solution
The true solution is to call
n stable BUT using
N_PREFIX points to the location you want to install node in.
/usr/local that does not require sudo is
$HOME/.local. It is adopted by many other programs. If you don't have this dir create it:
Now pass it to
n so that it can install node under
So here is the main step:
N_PREFIX=$HOME/.local n stable installing : node-v12.13.1 mkdir : /home/g/.local/n/versions/node/12.13.1 fetch : https://nodejs.org/dist/v12.13.1/node-v12.13.1-linux-x64.tar.gz installed : v12.13.1 to /home/g/.local/bin/node active : v8.10.0 at /usr/bin/node
You see that with a proper
N_PREFIX the output greets us, but in a weird way: we have managed to install it but the active version is one in
/usr/bin/node. Don't worry, simply delete that old node version:
sudo rm -rf /usr/local/node and run the following command again to see what the active version is:
N_PREFIX=$HOME/.local n stable installed : v12.13.1
The output tells us that now there is no active version. Whish means at least we removed to old one properly.
To activate the new node version, we simply need to tell our
.bashrc where to find it, so
vim ~/.bashrc and paste the following:
Then close and open a new terminal window and check the node version with:
node -v v12.13.1
And we are done. So for reference what we have done is to use a npm module n to update node without using sudo. We now have a clean setup where global node modules are installed by npm to
~/.node_modules_global and we have our open-source binaries for (node, npm, npx) living in our home directory under
Which is pretty neat.