node.js - ejemplos - ¿Cómo puedo hacer que múltiples proyectos compartan el directorio node_modules?
servidor express (6)
Cada vez 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
Absolutamente puede compartir un directorio node_modules entre proyectos.
De la documentación del nodo :
Si el identificador del 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 llegar a la raíz del sistema de archivos.
Por ejemplo, si el archivo en ''/home/ry/projects/foo.js'' se requiere 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 los requieren 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 directorios así:
-myProjects --node_modules --myproject1 ---sub-project --myproject2
Así, incluso las dependencias de su subproyecto pueden recurrir a su repositorio principal node_modules.
Un inconveniente para hacerlo de esta manera es que tendrá que construir su archivo package.json manualmente (a menos que alguien sepa una forma de automatizar esto con gruñido o algo así).
Cuando instala sus paquetes y agrega --save arg a un
npm install
lo agrega automáticamente a la sección de dependencias o su package.json, lo cual es conveniente.
Al mirar algunos artículos, parece que
Lerna
es una buena herramienta para administrar múltiples proyectos dentro de un solo directorio (
monorepo
).
Admite el intercambio de módulos sin duplicar los paquetes completos en cada carpeta y los comandos para instalarlos en múltiples proyectos.
El directorio principal debería verse así
node_modules
Project 1
Project 2
Project 3
Project 4
simplemente abra 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 olvides crear una carpeta vacía
node_modules
dentro del directorio de tu proyecto
Encontré un truco, solo eche un vistazo a los enlaces simbólicos (enlaces simbólicos) en Windows o Linux , está funcionando como accesos directos pero más potentes.
Simplemente necesita hacer un
Junction
para su carpeta
node_modules
cualquier lugar que desee.
La unión no es más que un atajo a su carpeta original node_modules.
Créelo dentro de la carpeta de su proyecto donde se habrían creado los node_modules reales si se
npm install
usado
npm install
.
Para lograr esto, necesita al menos una carpeta real
node_modules
luego hacer un cruce en los otros proyectos.
En Windows, puede usar el símbolo del sistema o una aplicación. Usar el símbolo del sistema te da un poco más de control, usar una aplicación es más fácil. Sugiero Link Shell Extension .
Prueba pnpm lugar de npm.
pnpm usa enlaces duros 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 existentes (y subdirectorios) use:
pnpm recursive install
Supongamos que tener un solo nodo_módulos debería 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 debe cambiar el nombre)
mi idea sería tener una sola raíz y múltiples 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 configure sus scripts de inicio para servir cualquier aplicación