npm throws error without sudo
This looks like a permissions issue in your home directory. To reclaim ownership of the .npm directory execute:
sudo chown -R $(whoami) ~/.npm
Permissions you used when installing Node will be required when doing things like writing in your npm directory (npm link
, npm install -g
, etc.).
You probably ran node installation with root permissions, that's why the global package installation is asking you to be root.
Solution 1: NVM
Don't hack with permissions, install node the right way.
On a development machine, you should not install and run node with root permissions, otherwise things like npm link
, npm install -g
will need the same permissions.
NVM (Node Version Manager) allows you to install Node without root permissions and also allows you to install many versions of Node to play easily with them.. Perfect for development.
- Uninstall Node (root permission will probably be required). This might help you.
- Then install NVM following instructions on this page.
- Install Node via NVM:
nvm install node
Now npm link
, npm install -g
will no longer require you to be root.
Edit: See also https://docs.npmjs.com/getting-started/fixing-npm-permissions
Solution 2: Install with webi
webi
fetches the official node
package from the node release API. It does not require a package manager, does not require sudo
or root
access, and will not change any system permissions.
curl -s https://webinstall.dev/node | bash
Or, on Windows 10:
curl.exe -sA "MS" https://webinstall.dev/node | powershell
Like nvm
, you can easily switch node versions:
webi node@v12
Unlike nvm
(or Solution 3 below), the npm
packages will be separate (you will need to re-install when you switch node versions).
Without changing npm
configuration, you can install globally:
npm install -g prettier
This solution is essentially an automated version of other solutions that install to $HOME
.
Solution 3: Install packages globally for a given user
Don't hack with permissions, install npm packages globally the right way.
If you are on OSX or Linux, you can create a user dedicated directory for your global package and setup npm
and node
to know how to find globally installed packages.
Check out this great article for step by step instructions on installing npm modules globally without sudo.
See also: npm's documentation on Fixing npm permissions.
Also you will need the write permission in node_modules
directory:
sudo chown -R $USER /usr/local/lib/node_modules