I tried to install generator-angularjs using Yo (Yoeman) without sudo:
npm install -g generator-angular
I get:
Error: EACCES, mkdir '/usr/lib/node_modules/generator-angular'
When I type in sudo yo
, yo tells me that I should not use sudo (which is perfectly understandable).
I have a ~/node_modules
directory - why doesn't yo install its packages there?
Thanks to @passy I managed to finally get this working on ubuntu 13.04 (in case anyone is having similar set up issues) with the following :
trying to run:
resulted in
Fixed using:
Running:
resulted in:
Fixed using:
hi in my case (on ubuntu 12.04), the prefix addition in ~/.npmrc did not changed anything.
if so, build the node package by yourself and install it in /opt/node or /home/user/.node.
From yoeman getting started page appears the command:
In my case, $NODE_PATH (which in my case, Ubuntu 14.04, is defined in /etc/profile.d) isn't the same than npm root. Adding in npm root in $NODE_PATH solve the problem.
I had an almost identical error involving a rogue
.yo-rc.json
file in my root directory from a project I installed earlier. Yeoman was switching cwd from the installation dir to root dir half way through the installation, but was only outputting the EACCESS permissions error without any details that the installation directory was/
. It took ages to figure out why this was, and involved debugging through the Yeoman source, but I eventually learned that Yeoman will look up through the directory tree until it finds a.yo-rc.json
, and generate the code there by calling chdir to the new location.Yeoman should maybe check that the user has write permissions for the directory. Alternatively, it could mention in the output either that the cwd has changed, or print the name of the installation directory if where it finds
.yo-rc.json
is different than cwd.The command for finding rogue .yo-rc.json files
sudo find / -name .yo-rc.json
I have been trying to get
yeoman
to play nice with myvagrant
box and this is what I had to do to installnpm
packages globally withoutsudo
onubuntu
:1. Create the directory to store global packages
$ mkdir "${HOME}/.npm-packages"
2. Tell
npm
where to put any packages installed globallyInsert this snippet into your
~/.npmrc
file:prefix=${HOME}/.npm-packages
3. Make sure that
npm
can locate installedbinaries
et ceteraInsert this snippet into your
.bashrc/.zshrc
:4. Run the following or restart terminal
$ source ~/.bashrc
Hope this helps anyone who finds themselves in a similar situation.
Generators are designed to be installed globally. Otherwise, you always have to install the generator you're about to use in each project, which is unnecessarily painful. Also, you don't get to see the lovely
yo
menu which lists you all the available generators (unless of course, you install them all locally):Setting up npm for global installation
So, how do we get npm to install packages globally? As you correctly said, you should never, ever run
yo
with sudo. There are lots of different solutions to this problem and you can spend hours discussing their pros and cons religiously.I personally dislike installing my user packages into the global
/usr/
folder./usr/
is for software that is shared across all users on the computer. Even if it's only using the machine, there are still good reasons to respect the way the Unix file system hierarchy is designed. For example if you decide at one point to wipe your whole node installation.My preferred way of enabling
npm
to install packages globally without breaking out of$HOME
is to set a local node prefix. This is as easy as runningin your local shell. After that, you want to adjust your $PATH, to point to the new installation destination for global node executables by adjusting your favorite shell's config. E.g. by adding
to your
~/.bashrc
. After that, you can happily runnpm install -g generator-angular
without sudo, without running into permission conflicts and if something is completely broken and you want to start from scratch, all you need to do is remove your~/.node
directory.