DEPRECATED as of macOS 10.13 (High Sierra). See the new GUIDE to install nvm and yarn for macOS (updated July 2019)
Installing node through Homebrew can cause problems with npm for globally installed packages. To fix it quickly, use the solution below. An explanation is also included at the end of this document.
This solution fixes the error caused by trying to run npm update npm -g
. Once you're finished, you also won't need to use sudo
to install npm modules globally.
Before you start, make a note of any globally installed npm packages. These instructions will have you remove all of those packages. After you're finished you'll need to re-install them.
Run the following commands to remove all existing global npm modules, uninstall node & npm, re-install node with the right defaults, install npm as its own pacakge, and configure the location for global npm modules to be installed.
# run the following commands
# this next line erases all the existing global npm packages
rm -rf /usr/local/lib/node_modules
# remove previously installed node
brew uninstall node
brew prune # clean all broken symlinks
brew update # always good to have the latest
# install node via brew, but without npm
# there are 2 options:
# - if you want to use `yarn` (yarnpkg.com), you need latest 'node'
# - if you don't use `yarn` (yarnpkg.com), prefer LTS 'node@6'
brew install node --without-npm
# install yarn (see yarnpkg.com for more info)
brew install yarn
# follow up with: https://yarnpkg.com/en/docs/install
You should now be able to run the node
command
# run the following commands
mkdir -p /usr/local/npm_packages
# ONLY IF THE COMMAND ABOVE FAILS >>>
# it means the permissions are wrong with your `/usr/local` folder, so fix it;
# normally, with Homebrew, your user should own the entire `/usr/local` folder:
sudo chown -R `whoami` /usr/local
# this is the root folder where all globally installed node packages will go
export NPM_PACKAGES="/usr/local/npm_packages"
export NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
# add to PATH
export PATH="$NPM_PACKAGES/bin:$PATH"
- IMPORTANT: make sure you do not have both a
.profile
and a.bash_profile
; if you do, copy everything from.profile
into.bash_profile
and then remove the.profile
- Check if the following or similar line exists in your
.bash_profile
:
[[ -s ~/.bashrc ]] && source ~/.bashrc
- make sure
.bashrc
is executable
# run the following commands
chmod +x ~/.bashrc
IMPORTANT: close all existing iTerm/Terminal sessions and re-open iTerm/Terminal before going further
Advanced: or just reload the .bash_profile
-- source ~/.bash_profile
Make sure ~/.npmrc
file exists, and contains a line as below:
prefix=/usr/local/npm_packages
curl -L https://www.npmjs.com/install.sh | sh
NOTE @ July 13 2017: the install script from above (from npmjs.com) silently fails and doesn't copy the npm package contents correctly (see comments below from @hughsw). In order to (hack)fix this you can do the following after running the above npm install.sh script.
The instructions below apply to npm 5.2.0
, but may work for earlier or later 5.x releases:
# manually download and un-targz into a local dir (it will be named `package`)
curl -L https://registry.npmjs.org/npm/-/npm-5.2.0.tgz | tar xz
# remove the broken npm symlink (generated by the nppmjs install.sh script)
rm -rf /usr/local/npm_packages/lib/node_modules/npm
# move the extracted `package` in the correct place and rename to `npm`
mv package /usr/local/npm_packages/lib/node_modules/npm
# that should do it. The bin/npm symlinks should now work
# make sure it works, and update to latest available npm:
npm install -g npm
# if you reach this step, w/o any errors => ALL OK!
That's it. You should now be able to run the npm
command without sudo
.
If you're a Homebrew user and you installed node via Homebrew, there is a major philosophical issue with the way Homebrew and NPM work together. If you install node with Homebrew and then try to do npm update npm -g
, you may see an error like this:
$ npm update npm -g
npm http GET https://registry.npmjs.org/npm
npm http 304 https://registry.npmjs.org/npm
npm http GET https://registry.npmjs.org/npm/1.4.4
npm http 304 https://registry.npmjs.org/npm/1.4.4
npm ERR! error rolling back Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
npm ERR! error rolling back at clobberFail (/usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:57:12)
npm ERR! error rolling back at next (/usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:43:14)
npm ERR! error rolling back at /usr/local/Cellar/node/0.10.26/lib/node_modules/npm/lib/utils/gently-rm.js:52:12
npm ERR! error rolling back at Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back npm@1.4.4 { [Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm] code: 'EEXIST', path: '/usr/local/bin/npm' }
npm ERR! Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
File exists: /usr/local/bin/npm
Move it away, and try again.
npm ERR! System Darwin 13.1.0
npm ERR! command "/usr/local/Cellar/node/0.10.26/bin/node" "/usr/local/bin/npm" "update" "npm" "-g"
npm ERR! cwd /Users/dan/Google Drive/Projects/dotfiles
npm ERR! node -v v0.10.26
npm ERR! npm -v 1.4.3
npm ERR! path /usr/local/bin/npm
npm ERR! code EEXIST
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /Users/dan/Google Drive/Projects/dotfiles/npm-debug.log
npm ERR! not ok code 0
There's an NPM bug for this exact problem. The bug has been "fixed" by Homebrew installing npm in a way that allows it to manage itself once the install is complete. However, this is error-prone and still seems to cause problems for some people. The root of the the issue is really that npm
is its own package manager and it is therefore better to have npm
manage itself and its packages completely on its own instead of letting Homebrew do it.
Also, using the Homebrew installation of npm
will require you to use sudo
when installing global packages. Since one of the core ideas behind Homebrew is that apps can be installed without giving them root access, this is a bad idea.
Yes, but not the way I intended. We switched to the latest node (8.1.2) and have not had trouble with the npm (5.0.3) that came with it.
The following is taken from the instructions I wrote for our team (with some stuff redacted). You will get a newer version of node than these instructions indicate.
Notes on prepping your Mac for Angular 4
We're upgrading to Angular 4.
This is a two-step process:
Before removing tools
Before removing tools, be sure to shut down any instances of
npm
that you may be running in terminals/shells for the service or the server.Grep for npm to verify that it's not running.
Example of a Verification Failure: you should not see any
npm
processes:Verification Success: you should only see the
fgrep
process$ ps ax | fgrep npm 6317 s006 S+ 0:00.00 fgrep npm
Get rid of old versions of tools
Remove stuff and verify that it's gone.
Look at what Yarn has installed globally (your list will be different).
Remove all yarn-managed packages
Use the first part of the package name following "info" for the package name:
$ yarn global remove nodemon [1/2] Removing module nodemon... [2/2] Regenerating lockfile and installing missing dependencies... warning No license field success Uninstalled packages. ✨ Done in 5.46s.
$ yarn global remove node-pre-gyp [1/2] Removing module node-pre-gyp... [2/2] Regenerating lockfile and installing missing dependencies... warning No license field success Uninstalled packages. ✨ Done in 5.25s.
$ yarn global remove node-gyp [1/2] Removing module node-gyp... [2/2] Regenerating lockfile and installing missing dependencies... warning No license field success Uninstalled packages. ✨ Done in 5.33s.
$ yarn global remove @angular/cli [1/2] Removing module @angular/cli... [2/2] Regenerating lockfile and installing missing dependencies... warning No license field success Uninstalled packages. ✨ Done in 2.33s.
Verify that they're all gone, and that there's no binary (Yarn's or anyone else's around)
I don't know why my two failure messages for
ng
vsnodemon
are so different.If you still have packages listed, or you still have a version of either
ng
ornodemon
available, you will have to figure out why and get rid of them all. Regarding binaries, friends include:Remove tools that
npm
managesYou may have tools globally installed and managed by
npm
. See if npm is managing tools:If you have tools in a tree as above, you have to remove each of them with
npm
. Remove each tool, exceptnpm
itself. E.g.Once
npm list -g --depth=0
only showsnpm
itself, then removenpm
:Remove tools from Brew
Remove
node
(andnpm
which it includes),yarn
, andwatchman
from your Brew installationAlso run this:
If the above command shows that you have
npm
intalled and managed by Brew, then you should includenpm
in the following commands that remove stuff; insert "npm" right before "node" in these commands.Verify that all of
yarn
,watchman
,npm
, andnode
are gone:If you still have any of those commands available, you will have to figure out why and get rid of them all.
Install up-to-date tools
Update and Upgrade Brew
Do the above two commands again, just to be sure (it shouldn't take long).
Install node (and npm)
Verify: