Normal installation would be sudo apt install nodejs
to install Node.js and then sudo apt install npm
to install Node Package Manager. However, upon doing so, npm -v
says 3.5.2
. To upgrade normally, I would do sudo npm install -g npm
, which updates to the latest version (which, at the time of writing this article, is 6.0.1
).
When I do a which npm
, I get /usr/local/bin/npm
, however apt
installs a symlink at /usr/bin/npm
. If I sudo apt purge npm
to remove npm, it still leaves the npm version of npm at /usr/local/bin/npm
, however npm -v
says -bash: /usr/bin/npm: No such file or directory
.
Many articles say to use a PPA to install nodejs, but I think there should be a native way to do this through apt
.
DigitalOcean instructions on installation normally and through PPA: https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-18-04
TecAdmin instructions on installation through PPA: https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/
TLDR: This problem is caused by Bash caching the path of the
npm
command, and can be solved byhash -d npm
. You don't even need to deal withapt purge
unless you want to.Explanation
Here were my steps for getting a new
npm
version on Ubuntu. First, do the installation as OP describes:You can see that the new version is already working fine in
/usr/local/bin/npm
, but unfortunately the Bash cache still has/usr/bin/npm
:To fix the problem, clear it from the Bash cache (do this in all open shells):
Now the new version works as desired:
The way I found is to purge npm through
sudo apt purge npm
, then simply recreate a symlink to the global installation vialn -s /usr/local/bin/npm /usr/bin/npm
. After that fix,npm -v
returns6.0.1
as expected.To have control on installed npm version, I always use
nvm
(node version control). You can install it through the instructions here: https://github.com/creationix/nvm Then by following command install the latest npm on your computer:nvm install node
Unfortunately none of the other answers worked for me. Here is how I got it to work on Ubuntu 18.04.
tl;dr do this:
Explanation:
I had installed npm via the default repositories (i.e. not PPA) which installed the
npm
executable to/usr/bin/npm
.When I updated it with
sudo npm install -g npm
, a new executable was installed to/usr/local/lib/nodejs/node-v10.16.3-linux-x64/bin/npm
.To get
npm
to work for a non-root user, you can put the following in that user's~/.profile
file (which I think is what is done when doingnpm install -g npm
withoutsudo
):However since this directory is not in root's
$PATH
environment variable it won't work forsudo
commands:As you can see,
sudo
does not use the latest npm, but instead uses the one installed via the package manager.The root's default
$PATH
on Ubuntu is:Since the package manager version of npm was installed in
/usr/bin
, we can just create a symbolic link to put the latest version higher up the$PATH
priority chain, like/usr/local/bin
, and this way it also won't be overwritten if the package manager version is ever updated:Note I'm assuming that if node is ever updated as well, this path will change, so you will have to repeat this step with the updated path: