I was working on a personal project this past week and got a weird error when I tried to compile my Sass files. Unfortunately, I did not screenshot the exact error, but was something along the lines of this:
Failed to write to location cssmin: style.css EACCES
That EACCES code threw me for a loop but I was able to deduce that it was a file permissions issue, based on the error description saying it was unable to write the file and from some quick StackOverflow searching.
I couldn’t find a lot of answers for how to fix this, so I made an attempt to fix it myself. Many of the forum threads I found suggested it could a permissions issue with Node, so I went through the painful exercise of reinstalling it and only made things worse because then Terminal could not even find the npm
or grunt
tasks.
I finally had to reach out to a buddy (thanks, Neal!) to sort things out. I thought I’d chronicle the process he took me through in case it helps other people down the road.
I’ll preface all this by saying I am working on a Mac. That said, I doubt that everything covered here will be universally applicable for all platforms.
Reinstalling Node
Before I talked to Neal, I went ahead and reinstalled Node via the installer package on nodejs.org.
I was told that my permissions issue will likely come up again on future projects until I take the step to re-install Node yet again using a package manager. Some people use Homebrew, though I’ve seen forums caution against it for various reasons. Node Version Manager appears to be a solid option because it’s designed specifically for managing multiple Node versions on the same machine, which makes it easy for future installations and version switching on projects.
Setting a Path to Node Modules
With Node installed, I expected I could point Terminal to my project:
cd /path/to/my/project/folder
…then install the Node modules I put in the project’s package.json
file:
npm install
Instead, I got this:
npm: command not found
Crap. Didn’t I just reinstall Node?
Turns out Terminal (or more correctly, my system in general) was making an assumption about where Node was installed and needed to be told where to look.
I resolved this by opening the system’s .bash_profile
file and adding the path there. You can get all geeky and open the file up with Terminal using something like:
touch .bash_profile
open .bask_profile
Or do what I did and simply open it with your code editor. It’s an invisible file, but most code editors show those in the folder panel. The file should be located in your user directory, which is something like Macintosh HD > Users > Your User Folder
.
This is what I added to ensure Node was being referenced in the correct location:
export PATH="$HOME/.npm-packages/bin:$HOME/.node/bin:$PATH"
That’s basically telling the system to go look in the .npm-packages/bin/
directory for Node commands. In fact, If I browse into that folder, I do indeed see my NPM and Grunt commands, both of which Terminal previously could not locate.

With that little snippet in hand and saved to .bash_profile
, I was stoked when I tried to install my Node modules again:
cd /path/to/my/project/folder
npm install
…and saw everything load up as expected!
Updating Permissions
My commands were up and running again, but I was still getting the same EACCES
error that I started with at the beginning of this post.
The issue was that the project folders were originally created as the Root user, probably when I was in Terminal using sudo
for something else. As a result, running my Grunt tasks with my user account was not enough to give Grunt permission to write files to those folders.
I changed directory to the folder where Grunt was trying to write my style.css
file, then checked the permissions of that folder:
cd /path/of/the/parent/directory
ls -al
That displays the permissions for all of the files and folders in that directory. It showed me that the permissions for the folder were indeed not set for my user account to write files to the folder. I changed directory to that specific folder and used the following command to make myself the owner (replacing username with my username, of course):
sudo chown -R username:staff
I went to run my Grunt tasks again and, voila, everything ran, compiled and saved as I hoped.
In Summary
I know the issues I faced here may either be unique to me or of my own making, but I hope this helps someone else. As a web designer, the command line can be daunting or even a little scary to me, even though I feel I’m expected to be familiar with tools that rely on it.
It’s great that we have community-driven sites like StackOverflow when we need them. At the same time, there is is often no substitute for reaching out for personal help.
The future of programming is less writing code and more dealing with configuration, which is a great deal more frustrating. This is especially true with younger tools and turns off a lot of people. Hopefully configuration starts to become easier as well.
Also, always have a permissions terminal recipe cookbook handy.
Do you have any good permission cookbooks handy an could share them? That’d be awesome :D
@thomas This is the most common commands I run. I run it in the project root. Be very careful not to run this in the server root. You may want to replace ./ with the full path to prevent mistakes. Sets 664 on files and 775 on directories recursively, and gives ownership to www-data and goose (my linux user, change this to be your linux user). www-data is the web user by default on ubuntu, you may need a different web user. You may want 644 and 755 instead. On rare occasion you may find some files require special permissions, such as bash or index.php files.