Los módulos NPM no se instalarán globalmente sin sudo

126

Acabo de reinstalar Ubuntu 12.04 LTS y, antes que nada, hice estos pasos :

  1. Nodo instalado a través del administrador de paquetes con el siguiente script

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. Intenté instalar yeoman, express, n, los generadores de yeoman a nivel mundial y todos ellos devolvieron el mismo error

    npm ERR! Error: EACCES, enlace simbólico '../lib/node_modules/n/bin/n'

    npm ERR! {[Error: EACCES, enlace simbólico '../lib/node_modules/n/bin/n'] errno: 3, código: 'EACCES', ruta: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Intente ejecutar este comando nuevamente como root / Administrator.

    npm ERR! Sistema Linux 3.8.0-29-genérico

    npm ERR! comando "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / inicio / heberlz

    npm ERR! nodo -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! ruta ../lib/node_modules/n/bin/n

    npm ERR! código EACCES

    npm ERR! errno 3

    npm ERR! Error de pila: EACCES, enlace simbólico '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Se pueden encontrar detalles de registro adicionales en:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! no está bien código 0

  3. Propiedad recuperada de las siguientes carpetas de forma recursiva ~ / .npm, / usr / lib / node, / usr / lib / node_modules, y de los siguientes enlaces simbólicos / usr / bin / node, / usr / bin / nodejs sin ningún éxito

Necesito instalar yeoman y sus generadores sin sudo para no tener problemas más adelante :(

HeberLZ
fuente
Gracias Phil, ahora se ve mucho mejor
HeberLZ
2
Si desea que npm instale paquetes globales en $ HOME en lugar de / usr, siga la guía github.com/sindresorhus/guides/blob/master/…
Coronel Panic
esto es lo que funcionó para mí github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL
Posible duplicado de npm error de lanzamiento sin sudo
Louis

Respuestas:

318

Ubuntu 12.04 y usando el PPA de Chris Lea para instalar los siguientes trabajos para mí:

npm config set prefix '~/.npm-packages'

y agregando $ HOME / .npm-packages / bin a $ PATH

anexar a .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

ver https://stackoverflow.com/a/18277225 de @passy

ErikAndreas
fuente
9
Esto parece una solución mucho más limpia. Si no le gustan las carpetas del sistema en su directorio de inicio, también puede usar una ubicación como ~ / .local / share / npm.
JeroenHoek
Debe tenerse en cuenta que después de cambiar el prefijo, debe reinstalar todos los módulos globales que había instalado anteriormente, incluido npm.
Dziamid
Esto parece estar bien, pero me resultó mucho más fácil dar permiso al usuario para escribir /usr/lib/node_modules/. O tal vez incluso sea apropiado crear un grupo unix de nodejs y darle permiso a ese grupo para escribir en ese directorio.
mehulkar
Un pequeño detalle para agregar es que debe crear el directorio ~ / npm usted mismo. De lo contrario, npm saldrá con ENOENT errores.
Jason Farnsworth
66
¿Por qué este no es el valor predeterminado para npm? Gracias por compartir.
Dorian
23

Si ya tiene $HOME/binen su camino, una solución más simple es simplemente ...

npm config set prefix ~
  • Ahora se instalarán nuevos comandos de nodo en su $HOME/bindirectorio.
  • ¡No hay necesidad de cambiar tu camino!

Dado que esta discusión se trata realmente de reducir los riesgos de seguridad de la ejecución sudo, también debe tener en cuenta que cualquier aplicación de nodo podría estar instalando un nombre de aplicación que no coincide con el nombre del paquete de nodo registrado que cree que está instalando. Por lo tanto, existe el riesgo de seguridad de que npm installse reemplace un comando del sistema existente o uno que ya tenga $HOME/bin. Si le preocupa, consulte primero las propiedades biny scriptsen el package.jsonarchivo de la aplicación que está instalando.

En general, es más seguro:

  • (a) Coloque el $HOME/binúltimo en su ruta para que los comandos del sistema no sean reemplazados.
  • (b) no incluya "." o cualquier ruta relativa en su $PATHpara que no ejecute accidentalmente un comando que esté en el directorio actual.

Referencia:

Tony O'Hagan
fuente
1
¡Otro problema de seguridad importante npmes que el código fuente que ve en un github.comrepositorio para un paquete de nodo puede no ser el mismo código que está instalando desde el npm.orgservidor de registro!
Tony O'Hagan
Si bien, en teoría, un paquete de nodo bien diseñado se instalará felizmente ~/bin, algunos paquetes de nodo (o sus paquetes dependientes) solo se han probado como de instalación, sudoasí que tenga en cuenta que puede encontrar un problema de "entorno de instalación" no probado. Al igual que cualquier otro problema del entorno (como el cambio de sistema operativo), el principio de "escribir una vez, probar en todas partes" sigue siendo válido.
Tony O'Hagan
La desventaja de este método es que npm crea un directorio adicional, llamado ~ / lib. Dependiendo de las prácticas de su organización, esto puede no ser deseable.
Sr. S
13

A octubre de 2014:

Node.js está disponible en el repositorio de distribuciones binarias NodeSource Debian y Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

Eso es.

Respuesta desactualizada:

La forma más rápida sin usar sudo es como se describe aquí por Isaac

¡Le recomiendo encarecidamente que no administre paquetes con sudo! Los paquetes pueden ejecutar scripts arbitrarios, lo que hace que sudo un comando del administrador de paquetes sea tan seguro como un corte de cadena. Claro, es rápido y definitivamente va a atravesar cualquier obstáculo, pero es posible que desee que ese obstáculo permanezca allí.

Recomiendo hacer esto una vez:

sudo chown -R $USER /usr/local

EDITAR:

Existen ciertas preocupaciones de seguridad y limitaciones de funcionalidad con respecto a cambiar la propiedad de / usr / local al usuario actual:

Dicho esto, si desea instalar un módulo global sin usar sudo, no veo una solución mejor (desde el punto de vista pragmático) que la mencionada. La seguridad frente a la facilidad de uso es un tema muy amplio, y no hay una respuesta fácil para eso, solo depende de sus requisitos.

Andrei Karpushonak
fuente
23
Esta es una mala idea porque hace que todo / usr / local pertenezca a un solo usuario.
Reed G. Law
44
Como señaló @ ReedG.Law, esta es realmente una mala idea. No cambie la propiedad de / usr / local a ningún usuario específico.
Christopher Will
3
Tengo que estar de acuerdo con Reed G Law: cambiar / usr / local es una idea MALA MALA MALA. En mi caso, estaba mirando instrucciones y lo hice: luego recordé que tengo que COMPARTIR esto con otra persona que se está desarrollando. Regresé y (con suerte) obtuve todos los cambios. No es solo seguridad, sino también funcionalidad.
Lloyd Sargent
3
¿Hay alguna desventaja en esta solución si solo hay un usuario en el sistema?
connorbode
2
Lo siento, quería decir /usr/local/lib/node_modulesynode
Creynders
11

El problema fue que instalé el nodo usando sudo , para evitar errores al instalar módulos npm a nivel mundial, NUNCA DEBE instalar el nodo con sudo.

Mi solución fue reinstalar el nodo de esta manera:

Descargue las últimas fuentes de nodo estable de nodejs.org # en mi caso node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #enter carpeta sin comprimir

sudo chown -R $ USUARIO / usr / local

./configure --prefix = / usr / local && make && make install

Una cosa a tener en cuenta es que solo tomar posesión de la carpeta / usr / local no funcionaría en mi caso porque la instalación del nodo en sí se realizó con sudo

Último paso para instalar yeoman: #although en yeoman.io dice que al hacer "npm install -g yo" ya instala bower y gruñido, hay algunos submódulos de gruñido que fallan, así que lo arreglé instalándolo solo

npm install -g bower

npm install -g gruñido

npm install -g yo

npm install -g generador-angular

HeberLZ
fuente
Genial en teoría, pero ¿hay alguna forma de lograr el mismo efecto sin verse obligado a construir Node e instalar 4 módulos adicionales solo para tener acceso a los módulos a nivel mundial?
Dan Nissenbaum
La respuesta seleccionada funciona exactamente como la necesita. Esto es lo que hice hace 2 años cuando todavía no había otra solución pública, pero ahora es inútil
HeberLZ
5

Resolví este problema con la variable de entorno y el alias de shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Para mí, npm no cumplió con la configuración de "prefijo" en .npmrc.

santervo
fuente
2

De acuerdo con esta publicación SO similar: npm arroja un error sin sudo

Parece que podría tener un problema de propiedad con el ~/.npmdirectorio.

Al igual que con la respuesta en esa, intente:

sudo chown -R `whoami` ~/.npm
prasanthv
fuente
En realidad, esto no funcionó como lo expliqué en el paso 3 de lo que intenté cuando no pude hacerlo funcionar, el problema era que había instalado el nodo usando sudo, lo que en algunas circunstancias puede causar problemas. Una vez que eliminé el nodo y lo reinstalé desde sus fuentes, ¡todo comenzó a funcionar como se esperaba!
HeberLZ
@HeberLZ Creo que tienes razón, intenté hacer esto en otra máquina ayer por la noche y no estaba funcionando. También tuve que lidiar con otros problemas de permisos. Todavía no estoy seguro de cuál es la mejor manera de no ejecutar esta instalación npm desde la fuente.
prasanthv
Enlace a la pregunta en los comentarios o marque la pregunta actual como un duplicado. No ayuda copiar y pegar respuestas de otras preguntas.
givanse
@HeberLZ el voto negativo de esta respuesta es inapropiado, ya que aborda el título de la pregunta que hizo.
Sebastian Sastre
No recuerdo cuándo rechacé la respuesta, pero en mi caso particular lo que escribió no solucionó el problema, por lo que creo que probablemente rechacé la respuesta. Como se indica en la pregunta: "Propiedad recuperada de las siguientes carpetas de forma recursiva ~ / .npm, / usr / lib / node, / usr / lib / node_modules, y de los siguientes enlaces simbólicos / usr / bin / node, / usr / bin / nodejs sin ningún éxito "Intenté obtener la propiedad de .npm, y todas esas otras carpetas sin éxito
HeberLZ
2

Encuentre la ruta al directorio de npm:

npm config get prefix

Para muchos sistemas, esto será / usr / local.

Cambie el propietario de los directorios de npm al nombre del usuario actual (¡su nombre de usuario!):

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Esto cambia los permisos de las subcarpetas utilizadas por npm y algunas otras herramientas (lib / node_modules, bin y share).

Aquí está el enlace para más detalles.

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Monis Majeed
fuente
Vital. Trate de evitar agregar biny shareentre paréntesis. Ignorar puede llevar a cambiar la propiedad de estas carpetas al usuario actual y problemas con la instalación de nuevos paquetes en el sistema sudoporque su propiedad también cambiará
A.Ametov
esta recomendación destruye todo mi sistema de archivos: (
UA_
1

Si estás en una máquina de desarrollo, es mejor que consideres usar nvm .

Si no, simplemente desea instalar usando su administrador de paquetes favorito.

Cualquiera sea el caso, recomendaría verificar esta respuesta en stackoverflow

Iam Zesh
fuente
1

En realidad, acabo de cambiar el permiso de una carpeta de usuario que era propiedad de root:

sudo chown -R $USER ~/.config/configstore

¡Entonces podría "npm install" e "bower install" sin sudo! Funcionó bien!

Vinggui
fuente
0

usando lubuntu 14.04.3, intenté cambiar la propiedad del prefijo .npm y npm, actualicé mi ruta, npm instaló módulos en mi directorio de inicio sin sudo pero la ruta era incorrecta, por lo que no se encontraron módulos como ember, linuxbew resolvió el problema, rápido guía de configuración aquí para nodo / npm

Conor
fuente
0

Este problema y otros causados ​​por el mismo motivo se pueden resolver instalando Node en el espacio del usuario.

Puedes hacerlo simplemente copiando y pegando en tu terminal

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Los mismos comandos se pueden iniciar también para actualizar Node a la última versión.

No olvides editar tu entorno. Solo una vez, haz

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Echa un vistazo a este artículo para saber cómo instalar Node.js sin sudo .

Para obtener una solución más general sobre este tema (es decir, instalar software localmente), consulte dotsoftware .

Gianluca Casati
fuente
0

solo use nvm, podrá cambiar dinámicamente entre diferentes versiones de nodo y se instalará localmente para su usuario. No se necesita sudo. Solo asegúrese de haber limpiado completamente el nodo anterior de antemano.

https://github.com/nvm-sh/nvm

Marko Nalis
fuente
-2

La mejor solución que encontré fue instalar Node.js desde el paquete tar en el directorio de inicio del usuario y vincular la ubicación de la carpeta lib. Aquí está lo que tú necesitas hacer

Esto instalará Nodejs en ~ / .local / en lugar del predeterminado / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Si aún encuentra un error de propiedad o permiso al instalar paquetes, cambie la propiedad de ~ / .local / dir ejecutando

chown -R user:user ~/.local/

Ahora debería ser bueno para instalar paquetes a través de 'npm'

Nota: TODOS LOS COMANDOS ANTERIORES DEBEN EJECUTARSE COMO USUARIO. NO USE SUDO O INICIO DE RAÍZ

NUNCA CAMBIE EL PERMISO DE CARPETAS BAJO '/ USR / LIB /'. Conducirá a un sistema operativo inestable

Shank_Transformer
fuente
-2

Las explicaciones de Pawel Grzybek me parecen muy convincentes: se reducen a 3 comandos sudo simples, sin tener que volver a usar sudo para las instalaciones globales de npm:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Frank Nocke
fuente