Actualmente estoy aprendiendo Angular y npm. Hoy intenté hacerlo npm i -g @angular/cli
en mi Fedora, pero en lugar de tenerlo instalado, vi en la terminal (he acortado el mensaje para mayor comodidad):
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
Entonces, revisé en Google qué significa. encontréesta explicación de npm, y este artículo me llevó aotro artículo de npmdescribiendo este error con más detalles. El último artículo decía que:
Si ve un error de EACCES cuando intenta instalar un paquete globalmente, puede:
Reinstale npm con un administrador de versiones de nodo (recomendado),
o
Cambiar manualmente el directorio predeterminado de npm
Como solución rápida, las dos soluciones anteriores parecían bien.
Pero como tengo algo de experiencia con Linux, comencé a preguntarme: ¿por qué tengo que instalar otro software, o por qué tengo que incluso cambiar alguna configuración? Hablando de otra manera, ¿por qué la configuración predeterminada para npm y la configuración predeterminada para Fedora requieren que ajuste incluso una de ellas para no tener ningún error?
Después de hacerme esas preguntas, pensé que el caso podría estar en mi configuración de npm. Lo más probable es que no haya cambiado nada desde la instalación, pero ¿quién sabe? Entonces, decidí reinstalar npm. Sin duda, reinicié la computadora después de la desinstalación. Después de reinstalar, lo intenté npm i -g @angular/cli
nuevamente, pero ocurrió el mismo error.
Entonces pensé: ¿tal vez no sea el caso de npm, quizás sea el caso de mi instalación de Fedora? Ciertamente no quería reinstalar Fedora por ese motivo. Entonces, verifiqué en Google si los permisos predeterminados de Fedora para el directorio /usr/lib/node_modules
son como están por defecto. Para mi directorio, para ambos /usr
y /usr/lib
( /usr/lib/node_modules
e incluso para /usr/lib/node_modules/npm
) el propietario y el grupo eran root root
y solo el propietario tiene permisos de escritura. La única fuente que encontré fue la "Guía de instalación de Fedora 26" (aunque tengo Fedora 29 instalado), y ese documento me aconsejaba revisar elEstándar de jerarquía del sistema de archivos 2.3para la estructura del directorio. Como esperaba node_modules
haber asignado exactamente los permisos que npm desea, verifiqué solo /usr
y /usr/lib
. Para el /usr
directorio, FHS no pareció indicar nada sobre permisos; para el /usr/lib
directorio, afirmó que:
/usr/lib incluye archivos objeto, bibliotecas y binarios internos que no están destinados a ser ejecutados directamente por usuarios o scripts de shell. [22]
Esta información tampoco fue de mucha ayuda.
Finalmente, llegué a la conclusión de que todavía no entiendo cuál es la verdadera causa del error que obtuve. Entonces ahora me gustaría preguntar:
- ¿Es que npm debe configurarse de forma predeterminada de la forma en que debe colocar los nuevos paquetes
/usr/lib/node_modules
? - En caso afirmativo, ¿fedora ha establecido otros permisos predeterminados que debería/deberá/podría tener para esos directorios?
- Si no, ¿es posible que haya cambiado accidentalmente los permisos de mi instalación de Fedora para esos directorios?
- En caso negativo, ¿es el caso de que no instalo paquetes npm con permisos de root? Esto también parece ser una solución, pero la documentación de npm no menciona dicha solución.
- En caso negativo, ¿se trata de mi caso de intentar instalar paquetes npm globalmente cuando no debería hacerlo? Si es así, ¿por qué existe tal posibilidad?
- ¿Hay algo que no entiendo o me falta? ¿Quizás me falta alguna documentación (actualizada)?
ACTUALIZAR:Olvidé señalar que ejecuto todos los comandos como usuario normal, no como root.
Respuesta1
No dijiste con qué usuario ejecutaste eso, pero supongo que no era root. En cuyo caso el error es correcto, pero también esperado porque los usuarios normales no deberían poder realizar la instalación en los directorios del sistema.
En ningún caso, nunca debería utilizar npm
para instalar paquetes globalmente con Node.js empaquetado en Fedora, aunque solo sea porque le dejará con un lío confuso de módulos administrados por rpm y npm en /usr/lib/node_modules
.
Desafortunadamente, a diferencia de otros entornos de lenguaje, Node.js no admite tener dos directorios de módulos globales separados (uno /usr
para los módulos administrados por el paquete del sistema y otro /usr/local
para los módulos administrados por las propias herramientas del entorno de lenguaje), por lo que no podemos hacer que esto funcione en de una manera sensata sin parches extensos de npm que no deseamos hacer. Incluso si tal división fuera posible, todavía necesitarías ser root para realizar una instalación global, tal como lo haces con Perl, Python o Ruby.
Según tengo entendido, Node.js desaconseja la instalación global de todos modos; la opinión ascendente es que debe instalar localmente en cada proyecto solo los módulos que el proyecto necesita.