tutorial start script run node deploy app git node.js heroku npm gitignore

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:

shrinkwrap

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:

  1. 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.
  2. 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

  1. Cree un enlace desde la plataforma específica node_modules al directorio node_modules y agregue node_modules a .gitignore .
  2. Ejecute npm install .
  3. Confirmar cambios en el repositorio submódulo.
  4. 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 la npm 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.