¿Cómo implementar la aplicación Node.js con la estructura deep node_modules en Windows?

Me encontré con un problema curioso: aparentemente algún módulo Node.js tiene jerarquías de carpetas tan profundas que el comando de copia de Windows (o el elemento de Copy-Item de PowerShell, que es lo que realmente estamos usando) golpea el infame error “ruta demasiado larga” cuando el camino tiene más de 250 caracteres de largo.

Por ejemplo, esta es una jerarquía de carpetas que un único módulo de nodo puede crear:

 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 nodo.

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 seria limitación en Windows.

¿No hay un comando npm o algo que compacte la carpeta node_modules o tal vez incluya solo lo que realmente es necesario en el tiempo de ejecución? (Los módulos de nodo generalmente contienen carpetas de test etc. que no necesitamos implementar). ¿Alguna otra idea sobre cómo solucionarlo? No usar Windows lamentablemente no es una opción 🙂

npm v3 (lanzado recientemente) resuelve este problema aplanando las dependencias. Consulte las notas de la versión aquí en https://github.com/npm/npm/releases/tag/v3.0.0 debajo de la sección flat flat .

Y el último comentario sobre este tema https://github.com/npm/npm/issues/3697

solo para agregar a esto … otra cosa que me ayudó fue enumerar todos los módulos instalados con npm ls .

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 de si eso es un error o qué (Nodo v 10.16)

Entonces, una vez que identifica un módulo duplicado, instálelo en el directorio raíz npm install dupemodule@1.2.3 --save-dev utilizando npm install dupemodule@1.2.3 --save-dev . La versión es importante.

después de eso, borré mi directorio node_modules e hice una nueva npm install .

Version corta

  1. npm ls para obtener una lista de todos los módulos instalados.
  2. mira a través de esos módulos e identifica los módulos duplicados (la versión es importante )
  3. npm install module@version --save-dev para instalar esos módulos en el directorio raíz node_modules y actualizar package.json.
  4. rmdir node_modules para eliminar el directorio node_modules.
  5. npm install para desplegar una nueva copia de sus dependencias.

Una vez que hice eso, todo estaba mucho más limpio.

También recomiendo comentar su archivo package.json para mostrar cuáles fueron bajados para aplanar el árbol node_modules.

No creo que haya una gran solución dadas sus limitaciones, pero aquí hay algunas cosas que pueden ayudar.

  • Intenta usar npm dedupe para optimizar tu jerarquía de directorios, lo que puede acortar algunas rutas
  • Use npm install --production para instalar sin las herramientas de desarrollo
  • Tome algunas de esas dependencias profundamente anidadas (lo suficiente como para evitar el problema, sugiero) y muévalas al directorio node_modules de nivel superior. Simplemente haga un seguimiento de ellos para que sepa cuáles son sus verdaderas dependencias y cuáles son soluciones para este problema.
  • O mueva algunas de esas dependencias profundas al directorio node_modules más alto en your_project/node_modules/pkg_with_deep_deps que les permita tener rutas lo suficientemente cortas pero que aún funcionen. Entonces este sería your_project/node_modules/pkg_with_deep_deps/node_modules .
    • Creo que require debería ser capaz de encontrarlos adecuadamente en tiempo de ejecución. Simplemente deberá documentar claramente lo que ha cambiado manualmente, por qué lo ha hecho y mantener sus propias dependencias verdaderas representadas con precisión en el package.json

Aquí hay un debate sobre el tema de Github que profundiza en este problema en detalle.

Escribí un módulo de nodo llamado “npm-flatten” que aplana tus 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/

La retroalimentación sería bienvenida.

Algo que me ayudó fue asignar un disco local a mi carpeta Node.js:

net use n: \ computername \ c $ \ users \ myname \ documents \ node.js / persistent: yes

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ó la instalación de algunos módulos.

Diré que acabo de volver a descubrir este problema hoy cuando estaba intentando 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 respaldarlos con la letra N: unidad, aún fallaba en algunos casos debido a la longitud de la ruta, pero fue suficiente para corregir la anterior.

1) Durante la comstackción de la versión, puede evitar que Visual Studio escanee estos archivos / carpetas estableciendo 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 empaque incluyendo el siguiente nodo XML en el archivo CsProject.

  ... bin\ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 File1.aspx;File2.aspx Folder1;Folder2  

Encontré una solución de Microsoft Node.js Guidelines .

  • Comience en una ruta corta (por ejemplo, c: \ src)
  • > npm install -g rimraf borra archivos que exceden max_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 versiones
  • Actualice a npm@3 que intenta hacer la jerarquía de la carpeta node_modules al máximo plana.
    • Se envía con el nodo v5
    • O … > npm install –g npm-windows-upgrade

Esta no es una solución adecuada, sino una solución cuando tienes prisa, pero puedes usar 7-Zip para comprimir tu carpeta, mover el archivo comprimido y descomprimirlo sin problemas.

Usamos esa solución para implementar una aplicación Node.js donde no fue posible realizar una instalación limpia de npm.