Cómo instalar paquetes npm globalmente y sin sudo en macOS y Linux
Cuando tenemos un error de permisos tando en Linux como en macOS es muy fácil escribir 'sudo' delante de un comando para que se instale sin que nos de ningún problema. Sin embargo, es posible que no queramos instalar los paquetes globalmente como usuario root sino para nuestro propio usuario. Para ello, tenemos que seguir unos sencillos pasos que tienen como objetivo hacer que npm instale los paquetes en nuestra home y no en el directorio que utilizaría por defecto; evitando así la necesidad de darle permisos especiales.
Suponiendo que el paquete que queréis instalar globalmente es create-react-app, el comando que tendréis que ejecutar es:
npm install -g create-react-app
Que nos lanzará el siguiente error:
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
...
npm ERR! Linux 4.4.0-21-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "install" "-g" "create-react-app"
npm ERR! node v6.10.2
npm ERR! npm v3.10.10
npm ERR! path /usr/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/lib/node_modules'
npm ERR! at Error (native)
npm ERR! { Error: EACCES: permission denied, access '/usr/lib/node_modules'
npm ERR! at Error (native)
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'access',
npm ERR! path: '/usr/lib/node_modules' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
npm ERR! Please include the following file with any support request:
npm ERR! /home/mario/projects/react/npm-debug.log
Si os fijáis, nos dice que no tiene permisos y que ejecutemos el comando como root o administrador, pero ya hemos dicho que vamos a intentar evitarlo. ¡Vamos a ver cómo!
1. Crear un directorio para los paquetes globales
mkdir "${HOME}/.npm-packages"
2. Indicar a npm dónde instalar los paquetes globales
Dado que vamos a cambiar el directorio de los paquetes globales, debemos indicarle a npm dónde están. Para ello, en el fichero ~/.npmrc añadimos:
prefix=${HOME}/.npm-packages
Si el fichero no existe, lo crearemos.
3. Asegurarnos de que npm encuentra los binarios instalados y las man pages
Dependiendo de qué terminal estemos utilizando, añadimos el siguiente contenido a los ficheros ~/.bashrc o ~/.zshrc:
NPM_PACKAGES="${HOME}/.npm-packages"
PATH="$NPM_PACKAGES/bin:$PATH"
unset MANPATH # elimina esto si ya has modificado el MANPATH anteriormente
export MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
Si utilizas macOS puede que el fichero .bashrc no exista y la consola esté obteniendo sus variables de entorno de otros ficheros como .profile o .bash_profile, los cuales se encuentran también en la home del usuario. En tal caso, añadid la siguiente línea a dicho archivo para cargar el fichero .bashrc:
source ~/.bashrc
Esta información la he obtenido porque me he encontrado con este problema y he visto la solución aquí. ¡Nada mejor que explicarla aquí para que todos la sepáis!