npm prefijo de ruta global

142

Estoy siendo más cauteloso de lo habitual porque he estado confundido por el comportamiento de npmen el pasado.

Estoy en una Mac y he instalado node.js a través brew install node.

Ahora que quiero ejecutar jslint.jsen la línea de comandos como el comando jslint, encuentro que la forma canónica de lograr esto es sudo npm install -g jslintque se ejecutó con éxito con esta salida:

$ 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)

Después

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

por /usr/local/share/npm/binno estar en mi $PATH.

1) ¿Por qué brewno instaló la npm binruta global a la ruta? Tal vez lo hizo, pero algo zshlo está arruinando. ¿Dónde podría encontrar eso?
2) ¿Debo hacer esto? (Añadir :/usr/local/share/npm/binal exportado $PATHen la parte inferior de mi ~/.zshrc)

Parece que esta no es la forma correcta de hacerlo porque si instalo algo más tarde (usando Homebrew o algo así) tendré que agregarlo a mi script de inicio zsh para establecer la ruta. Supongo que en este caso en particular es solo cuestión de npm install -gno hacer los enlaces simbólicos correctos en una ubicación "adecuada" (como /usr/local/bintal vez).

Creo que lo que haré es construir manualmente enlaces simbólicos dentro /usr/local/binpara cualquier programa con el que tenga problemas y debería ser lo suficientemente bueno para mis propósitos.

EDITAR : Estoy actualizando esto en 2019, porque esta vieja pregunta es popular pero ahora está desactualizada tanto en términos de mi flujo de trabajo personal como en términos de cómo instalar el nodo y administrar sus diversas dependencias.

Mi flujo de trabajo personal ahora es usar el instalador obtenido de nodejs.org para instalar el nodo en los sistemas. De hecho, confío en esto más que en el paquete homebrew en sí, porque sabe mejor cómo administrar los archivos. Si desea cambiar su nodo del sistema de 8.10 a 10.15, ya sea en Mac o Windows, simplemente descargue el instalador de nodejs.org para 10.15 para su sistema operativo. Intentar actualizar el nodo instalado a través de homebrew siempre ha demostrado ser un enfoque más difícil en mi experiencia.

Además, lo más importante a señalar es que el uso de sudo como se muestra en mi instalación npm de jslint ejemplo anterior es altamente desaconsejado; Estoy bastante seguro de que los paquetes homebrew nunca deben instalarse o interactuar de ninguna manera con el superusuario. ¡No debería ser necesario, y dará lugar a dolores de cabeza por permisos de archivo!

Además, recomiendo ESLint sobre jslint, y no he usado jslint en años.

Steven Lu
fuente
Gracias, ya están arreglados. Por lo general, no soy tan descuidado, pero escribí esta pregunta muy rápido
Steven Lu
@DaveNewton Normalmente hago eso, sí. Esta pregunta fue realmente descuidada, pero es una de las más populares.
Steven Lu
¿No es más fácil copiar texto que una captura de pantalla? de todos modos arreglado.
1
@ saleemrashid1 ​​Hola, tenía la intención de hacer esto. ¿Realmente lo leíste y lo copiaste? Gracias.
Steven Lu
3
¡Sí! De nada. Estoy trabajando en un juego y mientras esperaba que NPM descargara cosas, ¡lo hice!

Respuestas:

308

Extendiendo su PATHcon:

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

No es una idea terrible. Dicho esto, no deberías tener que hacerlo.

Ejecuta esto:

npm config get prefix

El valor predeterminado en OS X es /usr/local, lo que significa que npm enlazará binarios /usr/local/bin, que ya deberían estar en su PATH(especialmente si está utilizando Homebrew).

Entonces:

  1. npm config set prefix /usr/local si es otra cosa y
  2. ¡No lo uses sudocon npm! De acuerdo con los documentos de jslint , debería poder npm installhacerlo.

Si instaló npm como sudo ( sudo brew install), intente reinstalarlo con ol 'simple brew install. Se supone que Homebrew te ayudará a mantenerte sudolibre.

Trevor Burnham
fuente
1
¡Gracias! sin embargo, se npmniega a instalar a jslintnivel mundial npm install -g jslintfalla Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
Steven Lu
2
¿No lo necesitaría chown /usr/localsi tuviera que hacer que los scripts escribieran enlaces en él sin necesidad sudo? ¿Qué tal seguir esto para configurar nom / node en ~/.localo algo así?
Steven Lu
2
¡DULCE! Fui y deshice los diversos directorios depositados por el usuario rooten mi ~/directorio (por sudo rm -ron tmp/y a .npm/) y posteriormente npm install -g jslintfuncionó maravillosamente. Es genial que npm en sí mismo sea un programa de nodo y sea un poco una prueba de concepto de línea de comando JS para mí, lo que estoy empezando a apreciar ahora que lo entiendo un poco mejor.
Steven Lu
2
@StevenLu Sí, chown-ing /usr/localy todo lo que contiene es una práctica estándar en OS X. Consulte la página de solución de problemas en el wiki de Homebrew.
Trevor Burnham
Sí parece que el chowning de /usr/localque ya ha ocurrido en mi máquina de otro modo npmy otros plazo sin sudono sería capaz de depositar en los enlaces /usr/local/bin/, etc.
Steven Lu
8

Pasé un tiempo en este tema, y ​​el interruptor PATH no estaba ayudando. Mi problema fue el error Homebrew / node / npm que se encuentra aquí: https://github.com/npm/npm/issues/3794

Si ya instaló el nodo usando Homebrew, pruebe **** Nota por comentario que esto podría no ser seguro. Funcionó para mí, pero podría tener consecuencias no deseadas. También parece que la última versión de Homebrew instala correctamente npm. Así que probablemente me gustaría probar brew update, brew doctor, brew upgrade nodeetc antes de intentar ****:

npm update -gf

O, si desea instalar el nodo con Homebrew y hacer que npm funcione, use:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh
YPCrumble
fuente
3
No es una buena idea recomendar casualmente que las personas a nivel mundial fuercen una actualización.
toxaq
1
Seguir ciegamente los consejos de alguien en Internet no es una buena idea.
Volte
El método de fuerza en -gf lo hizo para mí. Gracias.
MEM
5

Yo uso brew y el prefijo ya estaba configurado para ser:

$ npm config get prefix
/Users/[user]/.node

Me di cuenta de que la carpeta bin y lib eran propiedad de root, lo que impedía la instalación no sudo habitual, por lo que se la volví a propietario al usuario

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

Luego, acabo de agregar la ruta a mi .bash_profile que se encuentra en / Users / [user]

PATH=$PATH:~/.node/bin
Greg
fuente
3

brew no debería requerir que uses sudo incluso cuando ejecutas npm con -g. Esto podría crear más problemas en el futuro.

Por lo general, brew o port le permiten actualizar su ruta para que no se arriesgue a estropear su .zshrc, .bashrc, .cshrc o cualquier sabor de shell que use.

Pascal Belloncle
fuente
De hecho, la cerveza no requiere y recomienda no usar sudo. Estaba usando sudo en npm(porque algo que leí me dijo). Tengo curiosidad acerca de dónde buscar cómo se establece el camino. En realidad, parece que el zshinstalador ejecuta algo que termina codificando el camino (en el momento de la instalación de zsh) en el .zshrcque no me gusta tanto
Steven Lu
Cualquier cosa instalada por npm debe instalarse en /usr/local. El /usrespacio de nombres de ruta está reservado para los paquetes oficiales de su distribución. /usr/local/binen su $ PATH o no, es un problema zsh.
Floby
los scripts de preparación no agregan nada a su script de inicio, esto es algo que debe hacer. vea madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x para ver un ejemplo.
Pascal Belloncle
2

Logré arreglar Vue Cli sin error de comando haciendo lo siguiente:

  • En terminal sudo nano ~/.bash_profile para editar tu perfil de bash.
  • Añadir export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • Guardar archivo y reiniciar terminal
  • Ahora deberías poder usar vue create my-projecty vue --versionetc.

Hice esto después de instalar el último Vue Cli de https://cli.vuejs.org/

Generalmente uso hilo, pero lo instalé globalmente con npm npm install -g @vue/cli. También puedes usar hilo si quieresyarn global add @vue/cli

Nota: puede que tenga que desinstalarlo primero globalmente si ya lo tiene instalado: npm uninstall -g vue-cli

¡Espero que esto ayude!

Mark Fasel
fuente
1
Esto básicamente funcionó para mí. Tuve que ajustarlo para exportar PATH = $ PATH: / Users / [your username] /node_modules/.bin
Mike Carpenter el
0

Intenta correr:

PATH=$PATH:~/npm/bin

y luego haga una prueba ejecutando expressen la línea de comando. Esto funcionó para mí.

kiko carisse
fuente
bastante seguro que quieres decir ~/.npm/bino algo así. no debería haber un npmdirectorio agregado a su directorio de inicio.
Steven Lu
0

Si ha vinculado los paquetes de nodos con el comando sudo

Luego vaya a la carpeta donde node_modules están instalados globalmente.

En los sistemas Unix, normalmente se colocan en / usr / local / lib / node o / usr / local / lib / node_modules cuando se instalan globalmente. Si establece la variable de entorno NODE_PATH en esta ruta, los módulos se pueden encontrar por nodo.

Windows XP -% USERPROFILE% \ Application Data \ npm \ node_modules Windows 7 -% AppData% \ npm \ node_modules

y luego ejecuta el comando

ls -l

Esto le dará la lista de todos los módulos de nodo global y podrá ver fácilmente los módulos de nodo vinculados.

selftaught91
fuente
0

sudo brew ya no es una opción, por lo que si instala con brew en este punto obtendrá 2 cosas realmente desagradables: A: le gusta instalar en /usr/local/opts/ según esto, / usr / local / shared. Esto no es un gran problema al principio, pero he tenido problemas con la RUTA de nodos, especialmente cuando instalé lint. B: estás atascado con los comandos sudo hasta que lo desinstales e instales de esta manera o puedas obtener la pila de Bitnami

Recomiendo este método sobre la opción de pila porque está listo si tienes varios proyectos. Si opta por la pila MEAN prefabricada, tendrá que configurar hosts virtuales en httpd.conf (más complicado en esta pila que XAMPP). proyecto, a menos que desee volver a señalar y reiniciar su servidor cuando termine de actualizar las cosas.

ángel
fuente
0

La solución simple es ...

Simplemente ponga el siguiente comando:

  1. sudo npm config get prefix

    si no es algo como esto /usr/local, entonces necesita arreglarlo usando el siguiente comando

  2. sudo npm config set prefix /usr/local...

Ahora funciona al 100% bien

Yogesh Kumar
fuente
Recomiendo evitar sudo con npm. Mira mi edición.
Steven Lu