Módulos particulares do aplicativo Node.js. Onde colocá-los?

8

A situação seria:

Desenvolvo 2 projetos no meu ambiente de desenvolvimento Node.js., P1 e P2.

O P1 exigiu o desenvolvimento de dois módulos simples, mod1 e mod2, armazenados em P1/lib. Cada um destes módulos resolve e encontra suas dependências externas P1/node_modules. As dependências necessárias para P1 foram instaladas nesta pasta via npm.

Agora, imagem que queremos reutilizar mod1 no outro projeto P2, aqui estão minhas dúvidas. Eu poderia...

  • Basta copiar mod1 para P2/lib. Replicação, então nem considero essa opção.

  • De P2, mod1 referência de P1: require($PROJECTS_DIR + '/P1/lib/mod1'). Não é uma boa opção, desta forma P2 dependeria de P1.

  • Coloque mod1 em um diretório de nível superior ou use NODE_PATH, para que P1 e P2 possam resolvê-lo apenas doint require('mod1'). No entanto, ao implantar, também devo implantar esse diretório de nível superior que parece um pouco sujo.

  • Gostaria de tratar o mod1 como um módulo npm, para que ele possa ser facilmente instalado em qualquer projeto ou ambiente. No entanto, nesse caso em particular, não posso publicar o módulo no npm, pois é muito específico para o projeto. Eu poderia criar um repositório npm privado e colocar o mod1 dentro. O essencial disso seria configurá-lo para ser acessado também a partir do ambiente de produção. Vale a pena?

  • Que tal juntar tudo isso node_modules? (dependências externas e minhas próprias bibliotecas). Isso seria ótimo, já que os módulos podem ser apenas necessários como `require ('module'). Mas também parece bastante sujo.

  • Não tenho certeza de como npm linkfuncionaria ao implantar. Ele cria um link simbólico, que não é seguido ao confirmar o código via Git ou SVN. Se eu executar npm installem produção, ele também instalará o módulo vinculado?

Nenhuma das opções acima me satisfaz. Não sei se uma delas é adequada ou vocês têm outras sugestões, mas existem formas preferidas de estruturar bibliotecas particulares para que possam ser facilmente reutilizadas em outros projetos?

jaime
fonte

Respostas:

6

Use npm link. Ele permite que você tenha um módulo onde quiser e, em seguida, pode "vinculá-lo" em seu projeto (um link simbólico será criado em sua pasta node_modules / folder), para que você possa usá-lo com require('mod1'). Seu módulo deve ser compatível com npm.

Mais informações aqui: https://docs.npmjs.com/cli/link

Sobre suas preocupações particulares, o npm pensou nisso e fornece a privateopção. Veja aqui: https://docs.npmjs.com/misc/registry (Vá para: "Não quero que meu pacote seja publicado no registro oficial. É privado.")

Para cada dependência de módulo, você pode simplesmente defini-los no pacote.json.

Florian Margaine
fonte
Obrigado Florian, quando eu submeto alterações via svn ou git, não recebo links simbólicos seguidos. Isso significa que eu teria que usar npm linktambém no ambiente de produção? Ou está implícito no npm install.Qualquer maneira de especificá-lo no package.json?
jaime
@jaime git e svn seguem links simbólicos.
Florian Margaine
Em ambientes de produção, eu executaria um script para empacotar os módulos na pasta node_modules /.
Florian Margaine
@jaime Você só precisa usar npm linkno desenvolvimento.
Daniel
docs.npmjs.com/… - 404. Mas realmente a melhor maneira de manter as coisas em sigilo é não colocá-las na internet. Parece que o link também é a melhor opção ... exceto os npmjs.org/doc/link.html 404 também. Tenho que amar a podridão do link.
Pat