Steven Lu Steven Lu - 1 month ago 16
Node.js Question

npm global path prefix

I am being more cautious than usual because I have been confused by the behavior of

npm
in the past.

I am on a Mac and have installed node.js through
brew install node
.

Now that I want to run
jslint.js
on the command-line as the command
jslint
I find that the canonical way to accomplish this is
sudo npm install -g jslint
which ran successfully with this output:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)


Subsequently

$ jslint ply.js
zsh: command not found: jslint


due to
/usr/local/share/npm/bin
not being in my
$PATH
.

1) Why did
brew
not install global
npm
bin
path to path? Maybe it did, but something
zsh
does is messing it up. Where might I be able to find that?

2) Should I do this? (Append
:/usr/local/share/npm/bin
to the exported
$PATH
at the bottom of my
~/.zshrc
)

It seems like this isn't the right way to do it because if I install something else later (using Homebrew or something) I'll be needing to append it to my zsh startup script to set the path. I guess in this particular instance it's just a matter of the
npm install -g
not making the right symlinks in a "proper" location (like
/usr/local/bin
maybe).

I think what I will do is manually build out symlinks inside
/usr/local/bin
for any programs that I have trouble with and it should be good enough for my purposes.

Answer

Extending your PATH with:

export PATH=/usr/local/share/npm/bin:$PATH

isn't a terrible idea. Having said that, you shouldn't have to do it.

Run this:

npm config get prefix

The default on OS X is /usr/local, which means that npm will symlink binaries into /usr/local/bin, which should already be on your PATH (especially if you're using Homebrew).

So:

  1. npm config set prefix /usr/local if it's something else, and
  2. Don't use sudo with npm! According to the jslint docs, you should just be able to npm install it.

If you installed npm as sudo (sudo brew install), try reinstalling it with plain ol' brew install. Homebrew is supposed to help keep you sudo-free.