Me encontré con un problema curioso: aparentemente, algunos módulos de Node.js tienen jerarquías de carpetas tan profundas que el comando de copia de Windows (o el de PowerShell, Copy-Item
que es lo que realmente estamos usando) llega al infame error de "ruta demasiado larga" cuando la ruta es superior a 250 caracteres de largo.
Por ejemplo, esta es una jerarquía de carpetas que puede crear un solo módulo de nodo:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Parece una locura pero es una realidad con los módulos de Node.
Necesitamos usar copiar y pegar durante la implementación (no estamos usando una plataforma de destino "inteligente" como Heroku donde la implementación de Git sería una opción) y esta es una limitación seria en Windows.
¿No hay un comando npm o algo que compacte la node_modules
carpeta o tal vez incluya solo lo que realmente es necesario en tiempo de ejecución? (Los módulos de nodo generalmente contienen test
carpetas, etc. que no necesitamos implementar). ¿Alguna otra idea de cómo solucionarlo? Desafortunadamente, no usar Windows no es una opción :)
package.json
condependencies
? Si es así, ¿podría copiar sinnode_modules
y usar npm toinstall
oupdate
las dependencias?npm install
en el entorno de destino, funciona creando un "paquete de implementación" localmente (básicamente un ZIP más algunos metadatos) que luego se carga en la máquina de destino, se extrae allí y listo. Entonces necesito incluirnode_modules
directamente.Respuestas:
npm v3 (lanzado recientemente) resuelve este problema nivelando las dependencias. Consulte las notas de la versión aquí en https://github.com/npm/npm/releases/tag/v3.0.0 en la
flat flat
sección.Y el último comentario sobre este tema https://github.com/npm/npm/issues/3697
fuente
flat flat
ahora están enterradas en otra página. Aquí hay un enlace directo: github.com/npm/npm/releases/tag/v3.0.0solo para agregar a esto ... otra cosa que me ayudó fue enumerar todos los módulos instalados con
npm ls
.lo que le dará un árbol de módulos y versiones ... a partir de ahí es bastante fácil identificar cuáles son duplicados ...
npm dedupe
no hizo nada por mí. No estoy seguro si eso es un error o qué (Nodo v 10.16)Entonces, una vez que identifique un módulo duplicado, instálelo en el directorio raíz node_module usando
npm install [email protected] --save-dev
. La versión es importante.después de eso, borré mi directorio node_modules e hice un nuevo
npm install
.Version corta
npm ls
para obtener una lista de todos los módulos instalados.npm install module@version --save-dev
para instalar esos módulos en el directorio raíz node_modules y actualizar package.json.rmdir node_modules
para eliminar el directorio node_modules.npm install
para extraer una copia nueva de sus dependencias.Una vez que hice eso, todo quedó mucho más limpio.
También recomiendo comentar su archivo package.json para mostrar cuáles fueron eliminados para aplanar el árbol node_modules.
fuente
No creo que haya ninguna gran solución dadas sus limitaciones, pero aquí hay algunas cosas que pueden ayudar.
npm dedupe
para optimizar la jerarquía de su directorio, lo que puede acortar algunas rutasnpm install --production
para instalar sin las herramientas de desarrollonode_modules
directorio más alto debajoyour_project/node_modules/pkg_with_deep_deps
que les permitirá tener rutas lo suficientemente cortas pero aún funcionar. Entonces esto seríayour_project/node_modules/pkg_with_deep_deps/node_modules
.require
debería poder encontrarlos correctamente en tiempo de ejecución. Solo necesitará documentar claramente lo que ha cambiado manualmente, por qué lo ha hecho y mantener sus propias dependencias reales representadas con precisión enpackage.json
Aquí hay una discusión sobre el tema de github que elabora este problema en detalle.
fuente
dedupe
(no sabía nada) y--production
(npm install -h
no mostró esta opción)! Desafortunadamente, usar un archivo ZIP no es una opción, vea un comentario arriba.Escribí un módulo de nodo llamado "npm-flatten" que aplana sus dependencias aquí: https://www.npmjs.org/package/npm-flatten
Si está buscando una distribución, también escribí un paquete NuGet que integrará un entorno node.js completo con su proyecto .NET aquí: http://www.nuget.org/packages/NodeEnv/
Sus comentarios serán bienvenidos.
fuente
Algo que me ayudó fue asignar una unidad local a mi carpeta Node.js:
uso neto n: \ computername \ c $ \ users \ myname \ documents \ node.js / persistent: sí
Antes: c: \ users \ myname \ documents \ node.js \ projectname (45 caracteres) Después: n: \ projectname (14 caracteres que son 31 caracteres menos)
En muchos casos esto permitió instalar algunos módulos.
Diré que acabo de redescubrir este problema hoy cuando intentaba hacer una copia de seguridad de todo mi código en una unidad USB.
"C: \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ extend-shallow \ benchmark \ fixtures es demasiado largo ".
Incluso cuando traté de hacer una copia de seguridad con la letra de unidad N: todavía fallaba en algunos casos debido a la longitud de la ruta, pero fue suficiente para arreglar el anterior.
fuente
1) Durante la compilación de la versión, puede evitar que Visual Studio escanee estos archivos / carpetas configurando las propiedades de la carpeta como una carpeta oculta (SOLO configúrelo en node_modules). Referencia: http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Puede excluir archivos o carpetas que se publican durante el empaquetado al incluir el siguiente nodo XML en el archivo CsProject.
fuente
He encontrado una solución a partir de Microsoft Node.js Directrices .
> npm install -g rimraf
eliminar archivos que excedanmax_path
> npm dedupe
mueve paquetes duplicados al nivel superior> npm install -g flatten-packages
mueve todos los paquetes al nivel superior, pero puede causar problemas de versionesnpm@3
que se intenta hacer elnode_modules
jerarquía de carpetas sea máximamente plana.> npm install –g npm-windows-upgrade
fuente
Esta no es una solución adecuada, sino más bien una solución cuando tiene prisa, pero puede usar 7-Zip para comprimir su carpeta, mover el archivo comprimido y descomprimirlo sin ningún problema.
Usamos esa solución para implementar una aplicación Node.js donde no era posible hacer una instalación npm limpia.
fuente