start - ¿Debo ingresar en node_modules para git al crear una aplicación node.js en Heroku?
npm heroku (11)
Segunda actualización
Las preguntas frecuentes ya no están disponibles.
De la documentación de shrinkwrap
:
Si desea bloquear los bytes específicos incluidos en un paquete, por ejemplo, para tener un 100% de confianza en poder reproducir una implementación o compilación, debe verificar sus dependencias en el control de origen o buscar algún otro mecanismo que pueda verificar Contenidos en lugar de versiones.
Shannon y Steven mencionaron esto antes, pero creo que debería ser parte de la respuesta aceptada.
Actualizar
La fuente enumerada para la siguiente recomendación ha sido actualizada . Ya no recomiendan que se node_modules
carpeta node_modules
.
Por lo general, no. Permita que npm resuelva las dependencias de sus paquetes.
Para los paquetes que implementa, como sitios web y aplicaciones, debe usar npm shrinkwrap para bloquear todo su árbol de dependencias:
Mensaje original
Como referencia, npm FAQ responde a su pregunta claramente:
Compruebe node_modules en git para ver qué cosas implementa, como sitios web y aplicaciones. No compruebe los node_modules en git para obtener bibliotecas y módulos destinados a ser reutilizados. Use npm para administrar dependencias en su entorno de desarrollo, pero no en sus scripts de implementación.
y por una buena razón para esto, lea el post de Mikeal Rogers sobre esto .
Fuente: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
He seguido las instrucciones básicas de inicio para node.js en Heroku aquí:
https://devcenter.heroku.com/categories/nodejs
Estas instrucciones no te dicen que crees un .gitignore node_modules, y por lo tanto implican que los node_modules deben estar registrados en git. Cuando incluyo node_modules en git, mi aplicación de inicio se ejecutó correctamente.
Cuando seguí el ejemplo más avanzado en:
https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (fuente)
Me ordenó agregar node_modules a .gitignore. Así que eliminé node_modules de git, lo agregué a .gitignore y luego lo re-implementé. Esta vez el desplegado falló así:
-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
Using Node.js version: 0.8.2
Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
Error: npm doesn''t work with node v0.8.2
Required: [email protected] || 0.5 || 0.6
at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
at Module._compile (module.js:449:26)
Error: npm doesn''t work with node v0.8.2
Required: [email protected] || 0.5 || 0.6
at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
at Module._compile (module.js:449:26)
Dependencies installed
-----> Discovering process types
Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9
Ejecutando "heroku ps" confirma el accidente. Ok, no hay problema, así que hice retroceder el cambio, agregar node_module al repositorio de git y lo eliminé de .gitignore. Sin embargo, incluso después de revertir, todavía aparece el mismo mensaje de error en la implementación, pero ahora la aplicación se está ejecutando correctamente de nuevo. Ejecutar "heroku ps" me dice que la aplicación se está ejecutando.
Entonces mi pregunta es ¿cuál es la forma correcta de hacer esto? Incluya node_modules o no? ¿Y por qué seguiría recibiendo el mensaje de error cuando retrocedo? Supongo que el repositorio de git está en mal estado en el lado Heroku?
Creo que la npm install
no debería ejecutarse en un entorno de producción. Hay varias cosas que pueden salir mal: la interrupción de npm, la descarga de nuevas dependencias (shrinkwrap parece resolver esto) son dos de ellas.
Por otro lado, node_modules
no debe ser confirmado en git. Aparte de su gran tamaño, comprometerse a incluirlos puede convertirse en una distracción.
Las mejores soluciones serían las siguientes: npm install
debería ejecutarse en un entorno de CI que sea similar al entorno de producción. Se ejecutarán todas las pruebas y se creará un archivo de lanzamiento comprimido que incluirá todas las dependencias.
De https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :
Edit: El enlace original era este, pero ahora está muerto. Gracias @Flavio por señalarlo.
Recordar.
- Solo registre node_modules para las aplicaciones que implemente, no los paquetes reutilizables que mantenga.
- Cualquier dependencia compilada debe tener su origen registrado, no los destinos de compilación, y debe reconstruir $ npm en el despliegue.
Mi parte favorita:
Toda la gente que agregó node_modules a su gitignore, elimine esa mierda, hoy , es un artefacto de una era que todos estamos muy felices de dejar atrás. La era de los módulos globales está muerta.
En lugar de verificar en node_modules, cree un archivo package.json para su aplicación.
El archivo package.json especifica las dependencias de su aplicación. Heroku puede decirle a npm que instale todas esas dependencias. El tutorial al que enlazaste contiene una sección sobre los archivos package.json.
Estoy usando esta solución:
- Cree un repositorio separado que contenga
node_modules
. Si tiene módulos nativos que deberían compilarse para una plataforma específica, cree un repositorio separado para cada plataforma. - Adjunte estos repositorios a su repositorio de proyectos con
git submodule
:
git submodule add .../your_project_node_modules_windows.git node_modules_windows
git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64
- Cree un enlace desde la plataforma específica
node_modules
al directorionode_modules
y agreguenode_modules
a.gitignore
. - Ejecute
npm install
. - Confirmar cambios en el repositorio submódulo.
- Confíe los cambios en el repositorio de su proyecto.
Por lo tanto, puede cambiar fácilmente entre node_modules
en diferentes plataformas (por ejemplo, si está desarrollando en OS X e implementando en Linux).
He estado utilizando tanto la carpeta node_modules como el envoltorio. Ambas soluciones no me hicieron feliz.
En resumen: los node_modules confirmados agregan demasiado ruido al repositorio.
Y shrinkwrap.json no es fácil de administrar y no hay garantía de que algún proyecto envolvente se desarrolle en unos pocos años.
Descubrí que Mozilla estaba usando un repositorio separado para uno de sus proyectos https://github.com/mozilla-b2g/gaia-node-modules
Así que no me llevó mucho tiempo implementar esta idea en una herramienta CLI de nodos https://github.com/bestander/npm-git-lock
Justo antes de cada construcción agregue
npm-git-lock --repo [[email protected]: su / dedicado / node_modules / git / repository.git]
Calculará el hash de su package.json y verificará el contenido de node_modules desde un repositorio remoto o, si es la primera compilación de este package.json, realizará una npm install
limpia y npm install
los resultados al repositorio remoto.
Iba a dejar esto después de este comentario: ¿Debo registrar en node_modules para git al crear una aplicación node.js en Heroku?
Pero lo estaba formateando raro. Si no tiene máquinas idénticas y está revisando en node_modules, haga un .gitignore en las extensiones nativas. Nuestro .gitignore se parece a:
# Ignore native extensions in the node_modules folder (things changed by npm rebuild)
node_modules/**/*.node
node_modules/**/*.o
node_modules/**/*.a
node_modules/**/*.mk
node_modules/**/*.gypi
node_modules/**/*.target
node_modules/**/.deps/
node_modules/**/build/Makefile
node_modules/**/**/build/Makefile
Pruebe esto comprobando primero todo y luego haga que otro desarrollador haga lo siguiente:
rm -rf node_modules
git checkout -- node_modules
npm rebuild
git status
Asegúrese de que no hay archivos cambiados.
Lo que funcionó para mí fue agregar explícitamente una versión npm a package.json ("npm": "1.1.x") y NO registrar nodos_módulos en git. Puede ser más lento de implementar (ya que descarga los paquetes cada vez), pero no pude compilar los paquetes cuando se registraron. Heroku estaba buscando archivos que solo existían en mi buzón local.
Mi mayor preocupación por no registrar node_modules
en git es que 10 años más tarde, cuando su aplicación de producción aún esté en uso, npm puede que no esté disponible. O npm podría corromperse; o los mantenedores pueden decidir eliminar la biblioteca en la que confía de su repositorio; o la versión que uses podría estar recortada.
Esto se puede mitigar con administradores de repositorios como maven, porque siempre puede usar su propio Nexus o Artifactory local para mantener un espejo con los paquetes que usa. Por lo que entiendo, tal sistema no existe para npm. Lo mismo ocurre con los administradores de bibliotecas del lado del cliente como Bower y Jamjs.
Si ha asignado los archivos a su propio repositorio git, puede actualizarlos cuando lo desee, y tiene la comodidad de compilaciones repetibles y el conocimiento de que su aplicación no se romperá debido a una acción de terceros.
No debe incluir node_modules
en su .gitignore
(o, más bien , debe incluir node_modules
en su fuente implementada en Heroku).
Si node_modules
:
- existe, entonces la
npm install
utilizará esas bibliotecas de proveedor y reconstruirá las dependencias binarias con lanpm rebuild
. - no existe, entonces
npm install
tendrá que recuperar todas las dependencias, lo que agrega tiempo al paso de compilación de slug.
Consulte la fuente de buildpack de Node.js para estos pasos exactos
Sin embargo, el error original parece ser una incompatibilidad entre las versiones de npm
y node
. Es una buena idea configurar siempre explícitamente la sección de engines
de sus packages.json
acuerdo con esta guía para evitar este tipo de situaciones:
{
"name": "myapp",
"version": "0.0.1",
"engines": {
"node": "0.8.x",
"npm": "1.1.x"
}
}
Esto asegurará la paridad dev / prod y reducirá la probabilidad de tales situaciones en el futuro.
http://nodejs.org/api/modules.html
[...] node 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 árbol.
Si está implementando sus propios módulos específicos para su aplicación, puede mantenerlos ( y solo aquellos ) en los módulos /node_modules
su aplicación. Y mueva todas las demás dependencias al directorio padre.
Este caso de uso es bastante impresionante, te permite mantener bien los módulos que creaste específicamente para tu aplicación con tu aplicación, y no llena tu aplicación con dependencias que pueden instalarse más adelante.