¿Cómo puedo hacer que varios proyectos compartan el directorio node_modules?

95

Siempre que hago proyectos, tengo que descargar todas las dependencias de los módulos de nodo. Sin copiar los node_modules, ¿hay alguna forma de compartir los node_modules centrales en múltiples proyectos?

como los siguientes, tengo que ejecutar muchos comandos cada vez.

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html
verystrongjoe
fuente
3
Puede instalarlos en un directorio principal común, si lo hay. El nodo recorrerá los directorios buscando el requiremódulo d. De lo contrario, no, no hay una node_modulescarpeta "central" oficial para usar require().
Jonathan Lonowski
Puede instalar globalmente estos paquetes utilizando la bandera global. Por lo tanto, no es necesario ejecutar comandos de instalación cada vez. npm install <npm_package_name> -g
Saba Hassan

Respuestas:

90

Absolutamente puede compartir un directorio node_modules entre proyectos.

De la documentación del nodo :

Si el identificador de módulo pasado a require () no es un módulo nativo y no comienza con '/', '../' o './', el nodo comienza en el directorio principal del módulo actual y agrega / node_modules e intenta cargar el módulo desde esa ubicación.

Si no se encuentra allí, se mueve al directorio principal, y así sucesivamente, hasta que se alcanza la raíz del sistema de archivos.

Por ejemplo, si el archivo en '/home/ry/projects/foo.js' llamado require ('bar.js'), entonces el nodo buscaría en las siguientes ubicaciones, en este orden:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Así que simplemente coloque una carpeta node_modules dentro de su directorio de proyectos y coloque los módulos que desee. Solo requiéralos como de costumbre. Cuando el nodo no encuentra un directorio node_modules en la carpeta de su proyecto, verificará la carpeta principal automáticamente. Así que haga su estructura de directorio así:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Así que así, incluso las dependencias de su subproyecto pueden basarse en su repositorio principal node_modules.

Un inconveniente de hacerlo de esta manera es que tendrás que construir tu archivo package.json manualmente (a menos que alguien sepa cómo automatizar esto con gruñido o algo así). Cuando instala sus paquetes y agrega --save arg a un npm installcomando, lo agrega automáticamente a la sección de dependencias o su package.json, lo cual es conveniente.

tpie
fuente
3
¿Por qué no se acepta esto como una operación de respuesta? Pregunta adicional a @tpie, si uno estructurara un proyecto como sugirió, ¿cómo construiría el package.json para instalarlo desde el repositorio del módulo principal?
diehell
@diehell Entonces parece que es "todo o nada". Si todas las dependencias o viven en un directorio principal y no hay un directorio node_modules en el CWD, npm comprobará el padre e instalará allí si lo encuentra. Si coloca una carpeta node_modules en el directorio, se instalará allí.
tpie
4
No veo cómo compartir node_modules puede manejar diferentes versiones de paquetes, los paquetes en node_modules no están versionados, a diferencia del npm-cache en c: \ users (Windows), ¿alguien se encontró con eso?
cyberguest
¿Cómo modificaría mi paradigma al escribir scripts npm y archivos package.json?
Maddocks
18

Encontré un truco, solo eche un vistazo a los enlaces simbólicos (enlaces simbólicos) en Windows o Linux , funciona igual que los atajos pero es más poderoso.

Simplemente necesita hacer un Junctionpara su node_modulescarpeta en cualquier lugar que desee. La unión no es más que un atajo a su carpeta node_modules original. Créelo dentro de la carpeta de su proyecto donde se habrían creado los módulos node_modules reales si se hubieran usado npm install.

Para lograr esto, necesita al menos una node_modulescarpeta real y luego haga un cruce en los otros proyectos.

En Windows, puede usar el símbolo del sistema o usar una aplicación. Usar el símbolo del sistema le brinda un poco más de control, usar una aplicación es más fácil, sugiero Link Shell Extension .

Eymen Elkum
fuente
1
Me cd al directorio de destino, ejecute este comando: mklink /d node_modules (source dir)\node_modules.
ChrisTorng
1
Mi equipo ha estado usando este método durante algún tiempo. Si bien realmente detesto no tener node_modulesen la carpeta del proyecto, esto funciona. Solo tengo que recordar buscar la node_modulescarpeta real antes de instalar algo nuevo: P
Andrew Craswell
Este método no parece funcionar para mí. Cuando utilizo uniones simbólicas o uniones, obtengo el siguiente error con node-sass: Error de compilación del módulo: "Error: el módulo no se registró automáticamente" y el error tiene más detalles que especifican el directorio donde existe el directorio node_modules "compartido". ¿Algunas ideas?
flipcode
1
¿Cómo evitar la reducción de la dependencia cuando se ejecuta npm installen cualquiera de las aplicaciones "conectadas"?
Qwerty
1
pero cuando ejecuto npm install <new-package>todos los paquetes que no están en el package.json de su proyecto actual se eliminan.
Rohit Kaushal
17

Pruebe pnpm en lugar de npm.

pnpm utiliza enlaces físicos y enlaces simbólicos para guardar una versión de un módulo solo una vez en un disco.

Instalar con:

npm install -g pnpm

Para actualizar sus instalaciones (y subdirectorios) existentes, utilice:

pnpm recursive install
Benson
fuente
8

El directorio principal debería verse así

node_modules
Project 1
Project 2
Project 3
Project 4

solo abre el archivo Project 1/.angular-cli.json

cambiar el esquema

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

a

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

y no olvide crear una node_modulescarpeta vacía dentro del directorio de su proyecto

Shahzad Seraj
fuente
Eres mi héroe. He dedicado una semana a esto. ¡¡Muchas gracias!!
Eliezer Berlin
5

Al mirar algunos artículos, parece que Lerna es una buena herramienta para administrar múltiples proyectos dentro de un solo directorio ( monorepo). Admite compartir módulos sin duplicar los paquetes completos en cada carpeta y comandos para instalarlos en múltiples proyectos.

pnpm también es una herramienta simple y eficiente, que no duplica los módulos que ya están instalados para otros proyectos.

Chris
fuente
0

Supongamos que teniendo un solo node_modules debe contener todos los paquetes para todas las aplicaciones. por lo tanto, sus aplicaciones también compartirán la mayoría de las entradas únicas de package.json (solo el nombre debería cambiar)

mi idea sería tener una sola raíz y varios niveles de src como se muestra a continuación

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

el único problema que podría enfrentar sería tener una copia de seguridad de json (o tsconfig) para cualquier aplicación y restaurarla cuando trabaje en ella o configurar sus scripts de inicio para servir cualquier aplicación

Fabio Guerrazzi
fuente