Módulos privados de la aplicación Node.js. ¿Dónde ponerlos?

8

La situación sería:

Desarrollo 2 proyectos en mi entorno de desarrollo Node.js, P1 y P2.

P1 requirió el desarrollo de dos módulos simples, mod1 y mod2, que se almacenan en P1/lib. Cada uno de estos módulos resuelve encontrar sus dependencias externas en P1/node_modules. Las dependencias necesarias para P1 se han instalado en esta carpeta a través de npm.

Ahora imagen que queremos reutilizar mod1 en el otro proyecto P2, aquí están mis dudas surgieron. Yo podría...

  • Solo copia mod1 a P2/lib. Replicación, así que ni siquiera considero esta opción.

  • De P2, mod1 referencia de P1: require($PROJECTS_DIR + '/P1/lib/mod1'). No es una buena opción, de esta manera P2 dependería de P1.

  • Coloque mod1 en un directorio de nivel superior o use NODE_PATH, para que P1 y P2 puedan resolverlo simplemente con doint require('mod1'). Sin embargo, al implementar, también debería implementar este directorio de nivel superior que parece un poco sucio.

  • Me gustaría tratar mod1 como un módulo npm, para que pueda instalarse fácilmente en cualquier proyecto o entorno. Sin embargo, en este caso particular, no puedo publicar el módulo en npm porque es demasiado específico del proyecto. Podría crear un repositorio npm privado y poner mod1 dentro. La esencia de esto sería configurarlo para poder acceder también desde el entorno de producción. ¿Vale la pena?

  • ¿Qué hay de poner todo junto node_modules? (dependencias externas y mis propias bibliotecas). Eso sería genial ya que los módulos se pueden requerir solo como 'require (' module '). Pero también parece bastante sucio.

  • No estoy seguro de cómo npm linkfuncionaría al implementar. Crea un enlace simbólico, que no se sigue al confirmar código a través de Git o SVN. Si corro npm installen producción, ¿también instalará el módulo vinculado?

Nada de lo anterior me satisface. No sé si uno de estos es adecuado, o si ustedes tienen otras sugerencias, pero, ¿hay alguna forma preferida de estructurar sus propias bibliotecas privadas para que puedan reutilizarse fácilmente en otros proyectos?

jaime
fuente

Respuestas:

6

Uso npm link. Le permite tener un módulo donde desee, y luego puede "vincularlo" en su proyecto (se creará un enlace simbólico en su nodo_módulos / carpeta), por lo que puede usarlo con require('mod1'). Su módulo tiene que ser compatible con npm.

Más información aquí: https://docs.npmjs.com/cli/link

Acerca de sus inquietudes privadas, npm pensó en esto y ofrece la privateopción. Consulte aquí: https://docs.npmjs.com/misc/registry (Vaya a: "No quiero que mi paquete se publique en el registro oficial. Es privado").

Para cada dependencia del módulo, simplemente puede definirlos en el paquete.json.

Florian Margaine
fuente
Gracias Florian, cuando confirmo los cambios a través de svn o git, no me siguen los enlaces simbólicos. ¿Significa que tendría que usar npm linktambién en el entorno de producción? ¿O está implícito en npm installalguna forma de especificarlo en package.json?
jaime
@jaime git y svn siguen enlaces simbólicos.
Florian Margaine
Sin embargo, en entornos de producción, ejecutaría un script para empaquetar los módulos en la carpeta node_modules /.
Florian Margaine
@jaime Solo necesitas usar npm linkcuando desarrolles.
Daniel
docs.npmjs.com/… - 404's. Pero realmente la mejor manera de mantener las cosas privadas es no ponerlas en Internet. Parece que el enlace también es la mejor opción ... excepto npmjs.org/doc/link.html 404 también. Me encanta amarrar la podredumbre.
Pat