Reputation: 18396
I just installed node and npm through the package on nodejs.org, and whenever I try to search or install something with npm, it throws the following error unless I sudo the command. I have a feeling this is a permissions issue? I am already the admin.
npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR! errno: 3,
npm ERR! code: 'EACCES',
npm ERR! path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /Users/chietala/npm-debug.log
npm ERR! not ok code 0
Upvotes: 1515
Views: 720104
Reputation: 23
The point of this issue is unexpectedly in another place. That is a command of git clone
with sudo
before the command of npm install
. like below:
$ sudo git clone some-git-repository
$ ls -al
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 14 20:14 .
drwxr-x--- 7 ubuntu ubuntu 4096 Apr 14 19:11 ..
drwxr-xr-x 5 root root 4096 Apr 14 20:14 some-project-directory
That's it. We had to use the command of git clone
without sudo
like this:
$ git clone some-git-repository
$ ls -al
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 14 20:14 .
drwxr-x--- 7 ubuntu ubuntu 4096 Apr 14 19:11 ..
drwxr-xr-x 5 ubuntu ubuntu 4096 Apr 14 20:14 some-project-directory
Upvotes: 0
Reputation: 25087
Changing the owner on "system-global" folders is a hack. On a fresh install, I would configure NPM to use an already writable location for "user-global" programs:
npm config set prefix "${HOME}/npm"
Then make sure you add that folder to your path:
export PATH="${PATH}:${HOME}/npm/bin"
To avoid future issues, do not use at all.sudo npm ...
See @ErikAndreas' answer to NPM modules won't install globally without sudo
, and longer step-by-step guide by @sindresorhus with also sets $MANPATH
.
Upvotes: 137
Reputation: 18584
When trying to install packages globally as root, the process will fail with EUIDLOOKUP
or EACCES
or npm
will mess up your user global packages permissions.
To understand the problem I would suggest reading this issue. In short npm
tries to use the EUID of current process to run installation scripts not as root
but as the original user running npm
while at the same time assuming that a user running as root would use sudo
so EUID will be set.
That's why answer of @JHM16 based on using sudo
should work.
But this is not the case when installing packages inside a container build. In containers sudo
will be more often than not missing. And build will usually just run as root.
Of course container build can be changed to run these commands as a regular user and build everything as that user. This will not make the build more secure though and could be undesirable in some situations.
So in a container build, here's how you can make npm
global install work for example with the yarn
package.
# setpriv --ruid 0 --euid 0 npm --unsafe-perm install -g yarn
setpriv
is a small low level utility that should be available or easily installable on any linux distro.
Upvotes: 1
Reputation: 13578
Watch OUT!!! Watch OUT!!! Watch OUT!!!
chown or chmod is NOT the solution, because of security-risk.
Instead do this, do:
First check, where npm point to, if you call:
npm config get prefix
If /usr is returned, you can do the following:
mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin
This create a npm-Directory in your Home-Directory and point npm
to it.
To got this changes permanent, you have to add the export-command to your .bashrc:
echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
Upvotes: 109
Reputation: 4925
Also you will need the write permission in node_modules
directory:
sudo chown -R $USER /usr/local/lib/node_modules
Upvotes: 398
Reputation: 34303
This looks like a permissions issue in your home directory. To reclaim ownership of the .npm directory execute:
sudo chown -R $(whoami) ~/.npm
Upvotes: 2503
Reputation: 449
simply try
npm rebuild
then after completion run your usual command
Upvotes: 2
Reputation: 3723
I tried everything in comments, without any succses, but following command did the magic for me:
hash -r
Upvotes: 0
Reputation: 3577
TL;DR
always use
sudo -i
orsudo -H
when runningnpm install
to install global packages.
When you use npm
, it downloads packages to your user home directory. When you run as sudo, npm
installs files to the same directory, but now they are owned by root.
So this is what happens to absolutely every single person who has ever used npm
:
npm install foo
sudo install -g foo-cli
without issuenpm install bar
npm
designers now that you have to go chmod
a directory againWhen you use the -i
or -H
option with sudo, your home directory will be root
's home directory. Any global installs will cache packages to /root/.npm
instead of root
-owned files at /home/me/.npm
.
Just always use sudo -i
or sudo -H
when running npm install
to install global packages and your npm
permissions problems will melt away.
For good.
--
q.v. the accepted answer for fixing an already messed up npm
.
Upvotes: 10
Reputation: 30987
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.js installation with root permissions, that's why the global package installation is asking you to be root.
Don't hack with permissions, install Node.js the right way.
On a development machine, you should not install and run Node.js 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.js without root permissions and also allows you to install many versions of Node to play easily with them.. Perfect for development.
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
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.
Upvotes: 749
Reputation: 671
I ran into this issue, and while it's true that ~/.npm
should be owned by your user, npm
was not installing the modules there.
What actually solved my issue is these commands:
npm config set prefix ~/.npm
export PATH="$PATH:$HOME/.npm/bin"
It will make sure that all your global installation will go under this prefix. And it's important that your user owns this directory.
Upvotes: 20
Reputation: 3555
Nobody mentioned this, but there is actually no need to mess up with permissions or a separate npm installation, just specifying a different cache folder to the command will fix the issue
npm install --cache .npm
npm run build --cache .npm
This will create a local .npm
folder
Upvotes: 2
Reputation: 798
use below command while installing packages
sudo npm install --unsafe-perm=true --allow-root
Upvotes: 1
Reputation: 35203
Problem: You do not have permission to write to the directories that npm uses to store global packages and commands.
Solution: Allow permission for npm.
Open a terminal:
command + spacebar then type 'terminal'
Enter this command:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
This solution allows permission to ONLY the directories needed, keeping the other directories nice and safe.
Upvotes: 4
Reputation: 2154
you could try this, works on ubuntu and mac
sudo chown -R $(whoami) /usr/local/lib/node_modules
Upvotes: 1
Reputation: 188
I like to use ubuntu groups to achieve this instead of changing owner. Its quite simple.
First install nodejs and npm using apt-get
sudo apt-get update && sudo apt-get install nodejs npm
Figure out who is logged in i.e username, run following command to see it in terminal
whoami
You can see the list of groups you are assigned by using a very simple command, normally the first group is your username itself
groups
Run following to allow access to logged in user
sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local
Update npm and nodejs
npm install -g npm
You are allset, your user can run npm commands without sudo
You can also refer to this link https://askubuntu.com/a/1115373/687804
Upvotes: 0
Reputation: 774
I Solve it by changing the owner from root to my user-name
sudo chown -R me:me /home/me/.config/configstore/
change me with your user-name and group .
Upvotes: 0
Reputation: 4073
In case sudo chown -R $(whoami) ~/.npm
didn't work for you, or you need a non terminal command solution.
The issue is that your user account does not have write permission to node_modules folder, so you can do the following
Open finder and press cmd
+ shift
+ g
this will open go to folder with url
Write the following path /usr/local/lib/node_modules
and press go
Right click on node_modules
folder and choose Get Info
Scroll down to sharing & permissions
section
Unlock to be able to make changes.
Press +
and add your user account
Make sure that you choose Read & Write
in privilege drop down
Now you should be able to install packages without sudo
and permission issues should be solved
Upvotes: 2
Reputation: 19232
ISSUE: You (the user) don't have the right set of permissions for the directory.
The instant way out is to run the npm install using sudo, but this may give you the same error, or improper installation.
AND changing directory ownership is not a good option, a temporary patch.
Solution/Suggestion: Change npm's Default Directory (from official docs)
Back-up your computer before moving forward.
(optional) In case you have a erroneous installation, first uninstall it:
npm uninstall <package-name> # use sudo if you used it while installation
npm cache verify # or, npm cache clean for npm version below 5.x.x
Make a directory for global installations:
mkdir ~/.npm-global
Configure npm to use the new directory path:
npm config set prefix '~/.npm-global'
Open or create a ~/.profile
or ~/.bash_profile
file and add this line:
export PATH=~/.npm-global/bin:$PATH
Back on the command line, update your system variables, or restart the terminal:
source ~/.profile
(optional) Test: Download a package globally without using sudo.
npm install -g jshint
Upvotes: 5
Reputation: 3064
Other answers are suggesting to change ownerships or permissions of system directories to a specific user. I highly disadvise from doing so, this can become very awkward and might mess up the entire system!
Here is a more generic and safer approach that supports multi-user as well.
Create a new group for node-users and add the required users to this group. Then set the ownership of node-dependant files/directories to this group.
# Create new group
sudo groupadd nodegrp
# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`
# Instant access to group without re-login
newgrp nodegrp
# Check group - nodegrp should be listed as well now
groups
# Change group of node_modules, node, npm to new group
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm
# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)
Now you can easily install your modules as user
npm install -g generator-angular
Some modules (grunt, bower, yo etc.) will still need to be installed as root. This is because they create symlinks in /user/bin/.
Edit
3 years later I'd recommend to use Node Version Manager. It safes you a lot of time and trouble.
Upvotes: 40
Reputation: 360
Best solution would be this which is provided by npm documentation.
For Ubuntu suggested solution is Option#2
Brief steps:
Make a directory for global installations:
mkdir ~/.npm-global
Configure npm to use the new directory path:
npm config set prefix '~/.npm-global'
npm config get prefix
can help you to verify if prefix was updated or not. The result would be <Your Home Directory>/.npm-global
Open or create a ~/.profile file and add this line:
export PATH=~/.npm-global/bin:$PATH
Back on the command line, update your system variables:
source ~/.profile
Instead of steps 2-4 you can also use the corresponding ENV variable (e.g. if you don't want to modify ~/.profile):
NPM_CONFIG_PREFIX=~/.npm-global
For Mac suggested solution is Option#3
On Mac OS you can avoid this problem altogether by using the Homebrew package manager
brew install node
Upvotes: 2
Reputation: 770
This is how I solved the issue on Windows 8.1:
Upvotes: 1
Reputation: 178
What to me seems like the best option is the one suggested in the npm documentation, which is to first check where global node_modules are installed by default by running npm config get prefix
. If you get, like I do on Trusty, /usr
, you might want to change it to a folder that you can safely own without messing things up the way I did.
To do that, choose or create a new folder in your system. You may want to have it in your home directory or, like me, under /usr/local
for consistency because I'm also a Mac user (I prefer not to need to look into different places depending on the machine I happen to be in front of). Another good reason to do that is the fact that the /usr/local
folder is probably already in your PATH (unless you like to mess around with your PATH) but chances are your newly-created folder isn't and you'd need to add it to the PATH yourself on your .bash-profile or .bashrc file.
Long story short, I changed the default location of the global modules with npm config set prefix '/usr/local'
, created the folder /usr/local/lib/node_modules
(it will be used by npm) and changed permissions for the folders used by npm with the command:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
Now you can globally install any module safely. Hope this helps!
Upvotes: 0
Reputation: 3314
@Yves M.'s answer was very similar to my solution. Here are the commands I used, which were slightly different from his.
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
Then query for the latest version:
nvm ls-remote
Then install the newest version:
nvm install YOUR_VERSION_HERE
example
nvm install v5.8.0
Upvotes: 0
Reputation: 5026
Another great fix here to configure NPM properly, run the following commands :
npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
Upvotes: 2
Reputation: 1090
The official documentation on how to fix npm install
permissions with an EACCES
error is located at https://docs.npmjs.com/getting-started/fixing-npm-permissions.
I encountered this problem after a fresh install of node using the .pkg
installer on OSX. There are some great answers here, but I didn't see a link to npmjs.com yet.
Option 1: Change the permission to npm's default directory
Find the path to npm's directory:
npm config get prefix
For many systems, this will be /usr/local.
WARNING: If the displayed path is just /usr, switch to Option 2.
Change the owner of npm's directories to the name of the current user (your username!):
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
This changes the permissions of the sub-folders used by npm and some other tools (lib/node_modules, bin, and share).
Option 2: Change npm's default directory to another directory
There are times when you do not want to change ownership of the default directory that npm uses (i.e. /usr) as this could cause some problems, for example if you are sharing the system with other users.
Instead, you can configure npm to use a different directory altogether. In our case, this will be a hidden directory in our home folder.
Make a directory for global installations:
mkdir ~/.npm-global
Configure npm to use the new directory path:
npm config set prefix '~/.npm-global'
Open or create a ~/.profile file and add this line:
export PATH=~/.npm-global/bin:$PATH
Back on the command line, update your system variables:
source ~/.profile
Upvotes: 32
Reputation: 3268
This is the solution I utilized and worked. I tried utilizing whoami
never worked.
sudo chown -R $USER /usr/local/lib/node_modules
then
sudo chown -R $USER /usr/local/bin/npm
then
sudo chown -R $USER /usr/local/bin/node
Upvotes: -1
Reputation: 75
John Papa points to the history and reasoning behind this issue and gives a solid fix:
John Papa's steps are to:
Hope this helps the curious!
Upvotes: 0
Reputation: 15587
As if we need more answers here, but anyway..
Sindre Sorus has a guide Install npm packages globally without sudo on OS X and Linux outlining how to cleanly install without messing with permissions:
Here is a way to install packages globally for a given user.
Create a directory for your global packages
mkdir "${HOME}/.npm-packages"
Reference this directory for future usage in your .bashrc/.zshrc:
NPM_PACKAGES="${HOME}/.npm-packages"
Indicate to npm where to store your globally installed package. In your
$HOME/.npmrc
file add:prefix=${HOME}/.npm-packages
Ensure node will find them. Add the following to your .bashrc/.zshrc:
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
Ensure you'll find installed binaries and man pages. Add the following to your
.bashrc
/.zshrc
:PATH="$NPM_PACKAGES/bin:$PATH" # Unset manpath so we can inherit from /etc/manpath via the `manpath` # command unset MANPATH # delete if you already modified MANPATH elsewhere in your config MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
Check out npm-g_nosudo for doing the above steps automagically
Checkout the source of this guide for the latest updates.
Upvotes: 12
Reputation: 1
I found that if you only sudo -s
"it just starts up a shell with root permissions as a one step" and it really works for me. I don't know if it's a good practice or not.
I hope it helps.
Reference: https://apple.stackexchange.com/posts/14423/revisions
Upvotes: -2