Debo comprobar en módulos de nodo a git al crear un nodo.js aplicación en Heroku?


Seguí las instrucciones básicas de introducción para node.js en Heroku aquí:

Https://devcenter.heroku.com/categories/nodejs

Estas instrucciones no le dicen que cree un .gitignore node_modules, y por lo tanto implica que node_modules se debe comprobar en git. Cuando incluyo node_modules en git, mi aplicación de introducción se ejecutó correctamente.

Cuando seguí el ejemplo más avanzado at:

Https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (fuente)

Me instruyó para agregar node_modules a .gitignore. Así que eliminé node_modules de git, lo agregué .gitignore, luego re-desplegado. Esta vez el deployed 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

Ejecutar "heroku ps" confirma el accidente. Ok, no hay problema, así que hice retroceder el cambio, agregar node_module de nuevo al git repositorio y lo eliminó .gitignore. Sin embargo, incluso después de revertir, todavía recibo el mismo mensaje de error en implementar, pero ahora la aplicación se está ejecutando correctamente de nuevo. Ejecutar "heroku ps" me dice que la aplicación se está ejecutando.

Así que mi pregunta es ¿cuál es la manera correcta de hacer esto? Incluir node_modules o no? ¿Y por qué seguiría recibiendo el mensaje de error cuando revierto? Mi conjetura es que el repositorio git está en un mal estado en el lado de Heroku?

Author: alex, 2012-07-12

11 answers

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 100% de confianza en poder reproducir una implementación o compilación, entonces debe verificar sus dependencias en el control de código fuente, o buscar algún otro mecanismo que pueda verificar el contenido en lugar de las versiones.

Shannon y Steven mencionaron esto antes, pero yo piensen, debe ser parte de la respuesta aceptada.


Actualizar

La fuente que figura en la siguiente recomendación se ha actualizado. Ya no recomiendan que se confirme la carpeta node_modules.

Por lo general, no. Permitir que npm resuelva dependencias para sus paquetes.

Para los paquetes que implementa, como sitios web y aplicaciones, debe usar npm shrinkwrap para bloquear su árbol de dependencias completo:

Https://docs.npmjs.com/cli/shrinkwrap


Post original

Para referencia, npm FAQ responde a su pregunta claramente:

Compruebe node_modules en git para las cosas que implementa, como sitios web y aplicaciones. No compruebe node_modules en git para bibliotecas y módulos destinado a ser reutilizado. Utilice npm para administrar dependencias en su dev entorno, pero no en los scripts de implementación.

Y para algunas buenas razones para esto, lea Mikeal Rogers' post on this .


Fuente: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git

 372
Author: Kostia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 12:34:05

Mi mayor preocupación con no comprobando node_modules en git es que 10 años después, cuando su aplicación de producción todavía está en uso, npm puede no estar presente. O npm puede corromperse; o los mantenedores pueden decidir eliminar la biblioteca en la que confía de su repositorio; o la versión que usa puede ser recortada.

Esto se puede mitigar con administradores de repo como maven, porque siempre puede usar su propio Nexo local o Artifactory para mantener un espejo con los paquetes que usa. Por lo que entiendo, tal sistema no existe para el mnp. Lo mismo ocurre con los administradores de bibliotecas del lado del cliente como Bower y Jamjs.

Si has enviado los archivos a tu propio repositorio git, entonces puedes actualizarlos cuando quieras, y tienes la comodidad de compilaciones repetibles y el conocimiento de que tu aplicación no se romperá debido a alguna acción de terceros.

 148
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-13 11:50:36

Debe no incluir node_modules en su .gitignore (o mejor dicho usted debe incluir node_modules en tu fuente desplegada en Heroku).

Si node_modules:

  • existe entonces npm install utilizará los pueden vender libs y reconstruir cualquier binario dependencias con npm rebuild.
  • no existe entonces npm install tendrá que buscar todas las dependencias en sí, lo que agrega tiempo al paso de compilación de slug.

Ver el Nodo.paquete de construcción js fuente para estos pasos exactos

Sin embargo, el error original parece ser una incompatibilidad entre las versiones de npm y node. Es una buena idea establecer siempre explícitamente la sección engines de su packages.json de 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á paridad dev/prod y reducirá la probabilidad de tales situaciones en el futuro.

 62
Author: Ryan Daigle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-18 21:34:27

Iba a dejar esto después de este comentario: Debería verificar node_modules en git al crear un nodo.js aplicación en Heroku?

Pero stackoverflow lo estaba formateando raro. Si no tiene máquinas idénticas y está comprobando node_modules, haga una .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 primero comprobando 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 haya cambios en los archivos.

 20
Author: ibash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:08

He estado usando tanto la carpeta de confirmación node_modules como la envoltura retráctil. Ambas soluciones no me hicieron feliz.

En resumen: commited node_modules añade demasiado ruido al repositorio.
Y los paquetes.json no es fácil de administrar y no hay garantía de que algún proyecto con envoltura retráctil se construya en unos pocos años.

Encontré 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 nodo https://github.com/bestander/npm-git-lock

Justo antes de cada compilación añadir
npm-git-lock rep repo [[email protected]:your/dedicated/node_modules/git/repository.git]

Calculará el hash de tu paquete.json y revisará el contenido de node_modules de un repositorio remoto, o, si es la primera compilación para este paquete.json, hará una limpieza npm install y enviará los resultados al repositorio remoto.

 7
Author: bestander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-19 13:51:05

Creo que 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 dependencias más nuevas (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, los commits que los incluyen pueden distraer.

Las mejores soluciones serían las siguientes: npm install debe ejecutarse en un entorno de CI que sea similar al entorno de producción. Todas las pruebas ejecutar y se creará un archivo de liberación comprimido que incluirá todas las dependencias.

 7
Author: user2468170,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 09:47:22

Lo que funcionó para mí fue agregar explícitamente una versión npm al paquete.json ("npm": "1.1.x") y NO registrando node_modules en git. Puede ser más lento de implementar (ya que descarga los paquetes cada vez), pero no pude obtener los paquetes para compilar cuando se registraron. Heroku estaba buscando archivos que solo existían en mi caja local.

 3
Author: Jason Griffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-13 14:12:13

En lugar de revisar node_modules, crea un paquete.archivo json para su aplicación.

El paquete.el archivo json especifica las dependencias de la aplicación. Heroku puede entonces decirle a npm que instale todas esas dependencias. El tutorial al que ha enlazado contiene una sección sobre el paquete.archivos json.

 2
Author: matzahboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 19:56:12

Estoy usando esta solución:

  1. Crea un repositorio separado que contenga node_modules. Si tiene módulos nativos que deben compilarse para una plataforma específica, cree un repositorio separado para cada plataforma.
  2. Adjunte estos repositorios al repositorio de su proyecto 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

  1. Crea un enlace desde node_modules al directorio node_modules específico de la plataforma y agrega node_modules a .gitignore.
  2. Ejecutar npm install.
  3. Submódulo de confirmación cambios en el repositorio.
  4. Confirme los cambios en el repositorio de su proyecto.

Así que puede cambiar fácilmente entre node_modules en diferentes plataformas (por ejemplo, si está desarrollando en OS X y desplegando en Linux).

 2
Author: mixel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-27 21:24:24

Desde https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html:

Editar: El enlace original era este pero ahora está muerto. Gracias @ Flavio por señalarlo.

Para recapitular.

  • Solo checkin node_modules para aplicaciones que implemente, no reutilizables paquetes que usted mantiene.
  • Cualquier dependencia compilada debe tener su código fuente registrado, no los destinos de compilación, y debería rebuild npm rebuild en despliegue.

Mi parte favorita:

Todas las personas que agregaron node_modules a su gitignore, eliminen eso mierda, hoy, es un artefacto de una época que estamos muy felices de dejar tras. La era de los módulos globales está muerta.

 2
Author: Benjamin Crouzier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 19:52:32

Http://nodejs.org/api/modules.html

[...] el nodo comienza en el directorio padre del módulo actual, y agrega /node_modules, e intenta cargar el módulo desde esa ubicación.

Si no se encuentra allí, entonces se mueve al directorio padre, y así sucesivamente, hasta que se alcanza la raíz del árbol.

Si estás rodando tus propios módulos específicos para tu app, puedes mantenerlos (y solo aquellos) en el /node_modules de tu app. Y mueva todas las demás dependencias al directorio padre.

Este caso de uso de bastante impresionante, le permite mantener los módulos que creó específicamente para su aplicación muy bien con su aplicación, y no saturar su aplicación con dependencias que se pueden instalar más tarde.

 1
Author: laggingreflex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 20:13:08