Especifique la ruta a node_modules en package.json

96

¿Hay alguna forma de mover el directorio node_modules en una aplicación para decir / vendor / node_modules como lo hace bower con el archivo bowerrc? Pensé que podría especificarse en package.json pero parece que no puedo encontrar una solución. Su ayuda es muy apreciada.

esturoide
fuente
@blunderboy gracias por el enlace. Es una locura que no haya una forma más fácil de hacerlo. Oh bien.
sturoid
26
No estoy seguro de por qué ha aceptado una respuesta que claramente no responde a su pregunta. Pregunta cómo establecer la ruta hacia node_modules adentropackage.json , y la respuesta de xShirase simplemente no proporciona una forma de hacerlo.
Mark Amery
4
Probablemente aceptó la respuesta porque claramente se trata de un problema XY y una solución alternativa es mejor que "lo siento, eso no es posible".
Jake Holzinger

Respuestas:

58

sí, puede, simplemente configure la variable env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Según el doc:

Si la variable de entorno NODE_PATH se establece en una lista de rutas absolutas delimitada por dos puntos, el nodo buscará módulos en esas rutas si no se encuentran en otro lugar. (Nota: en Windows, NODE_PATH está delimitado por punto y coma en lugar de dos puntos).

Además, el nodo buscará en las siguientes ubicaciones:

1: $ INICIO / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Donde $ HOME es el directorio de inicio del usuario y $ PREFIX es el nodo_prefijo configurado del nodo.

Estos se deben principalmente a razones históricas. Le recomendamos encarecidamente que coloque sus dependencias localmente en las carpetas node_modules. Se cargarán más rápido y de manera más confiable.

Fuente

xShirase
fuente
1
Eso es grandioso. Entonces, en mi caso, donde tengo node_modules locales para cada aplicación que estoy construyendo, ¿haría esa exportación en un archivo js en el proyecto?
sturoid
3
no, es una variable de entorno, se configura a nivel de sistema. Entonces tienes que escribirlo en tu terminal. Se accede a las variables env dentro de una aplicación de nodo enprocess.env
xShirase
Hmmm suena bien. Tendré que investigarlo un poco más. Gracias por la ayuda.
sturoid
112
Realmente no creo que esta sea la respuesta a la pregunta: estaba solicitando una propiedad dentro del package.json para poner una ruta para los paquetes npm LOCAL (nivel de aplicación). Esta respuesta le dice cómo puede mover los paquetes instalados GLOBALMENTE (-g) a otra carpeta.
David Losert
2
@IsmailIqbal Lo siento, vi tu comentario hace un momento. Han pasado dos años en el mundo de la NPM y dimos un gran salto con el almacenamiento en caché, yarn o incluso npm5, webpack ... Yo diría que el manejo de node_module en estos días es mucho mejor. En su caso, simplemente haría una "instalación npm" en todas las ubicaciones - como npm almacena en caché los paquetes ya instalados, es lo mismo que copiarlo manualmente sin la sobrecarga.
David Losert
28

En resumen: no es posible y, como parece, nunca será compatible (consulte aquí https://github.com/npm/npm/issues/775 ).

Hay algunas soluciones hacky con el uso de CLI o ENV-Variables (ver la respuesta seleccionada actual), .npmrc-Config-Files o npm link- lo que todos tienen en común: nunca son solo específicos del proyecto, sino siempre de algún tipo de globalSoluciones.

Para mí, ninguna de esas soluciones es realmente limpia porque los colaboradores de su proyecto siempre necesitan crear alguna configuración especial o tener algún conocimiento especial; no pueden simplemente npm instally funciona.

Entonces: O tendrá que colocar su package.json en el mismo directorio donde desea que se instalen sus node_modules, o vivir con el hecho de que siempre estarán en el directorio raíz de su proyecto.

David Losert
fuente
16
"Si desea escribir" node_modules "de manera diferente, lo siento, no puedo hacerlo. Eso está integrado en node-core. Cambiar eso equivale a crear un administrador de paquetes completamente diferente". <== buen trabajo usando variables, supongo.
stevedbrown
Un comentario de 2019: parece que yarn admite anular el directorio de módulos. Bueno, supongo que Yarn es un nuevo administrador de paquetes.
Vanuan
10

Yarn admite esta característica:

# .yarnrc file in project root
--modules-folder /node_modules

Pero su experiencia puede variar según los paquetes que utilice. No estoy seguro de que quieras entrar en esa madriguera del conejo.

Vanuan
fuente
6

No estoy seguro de si esto es lo que tenía en mente, pero terminé con esta pregunta porque no pude instalar node_modulesdentro de mi directorio de proyecto ya que estaba montado en un sistema de archivos que no admitía enlaces simbólicos (una carpeta VM "compartida" ).

Encontré la siguiente solución:

  1. Copie el package.jsonarchivo a una carpeta temporal en un sistema de archivos diferente
  2. Corre npm installallí
  3. Copie el node_modulesdirectorio resultante de nuevo en el directorio del proyecto, utilizando cp -r --dereferencepara expandir los enlaces simbólicos en copias.

Espero que esto ayude a alguien más que termine con esta pregunta cuando busque una forma de moverse node_modulesa un sistema de archivos diferente.

Otras opciones

Hay otra solución, que encontré en el problema de github al que @Charminbear se vinculó , pero esto no funciona gruntporque no es compatible NODE_PATHcon https://github.com/browserify/resolve/issues/136 :

digamos que tiene /media/sf_sharedy no puede instalar enlaces simbólicos allí, lo que significa que en realidad no puede instalar npm desde /media/sf_shared/myprojectporque algunos módulos usan enlaces simbólicos.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (puede crear un enlace simbólico en esta dirección, pero no puede crear uno dentro de / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
Rico
fuente