node.js - tutorial - npm install
¿Cómo implementar la aplicación Node.js con la estructura deep node_modules en Windows? (8)
1) Durante la compilació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.
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == ''Debug|AnyCPU'' ">
...
<OutputPath>bin/</OutputPath>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
<ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>
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 :)
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.
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 excedenmax_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 carpetanode_modules
al máximo plana.- Se envía con el nodo v5
- O ...
> npm install –g npm-windows-upgrade
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.
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.
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 enyour_project/node_modules/pkg_with_deep_deps
que les permita tener rutas lo suficientemente cortas pero que aún funcionen. Entonces este seríayour_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 elpackage.json
- Creo que
github.com/joyent/node/issues/6960 que profundiza en este problema en detalle.
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 [email protected] --save-dev
utilizando npm install [email protected] --save-dev
. La versión es importante.
después de eso, borré mi directorio node_modules e hice una nueva npm install
.
Version corta
-
npm ls
para obtener una lista de todos los módulos instalados. - mira a través de esos módulos e identifica los módulos duplicados (la versión es importante )
-
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 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.