2017-03-01 2 views
0

TL; DR Comment configurer différents "sous-modules" dans un projet modulaire node.js pour se référer aussi simplement que possible? J'essaie de me concentrer sur les paquets locaux pour NPM, en particulier en ce qui concerne un projet modulaire.Nœud/NPM gérant des packages locaux

Je construis une application web avec une interface frontale et une API back-end. Ceux-ci doivent partager un paquet qui exporte des modèles simples. Ma structure de répertoire du projet ressemble à ceci:

package 
├── api 
│   ├── dist 
│   │   └── <compiled files> 
│   ├── node_modules 
│   │   └── ... 
│   ├── package.json 
│   └── src 
│    └── <source files> 
├── application 
│   ├── dist 
│   │   └── <compiled files> 
│   ├── node_modules 
│   │   └── ... 
│   ├── package.json 
│   └── src 
│    └── <source files> 
└── models 
   ├── dist 
    │   └── <compiled files> 
   ├── node_modules 
   │   └── ... 
   ├── package.json 
   └── src 
    └── <source files> 

Les deux projets API et applications vont utiliser des modèles, donc j'abstraire ce code à un sous-module séparé dans mon projet.

J'ai lu la documentation pour npm link et cela semble être la bonne approche parce que, si je comprends bien, il symbolise le paquet dans le répertoire node_modules. Cela donne accès au code tel qu'il existe actuellement, au lieu d'installer une copie dans node_modules. Cela ressemble à ce dont j'ai besoin, mais il y a une ride: je travaille sur ce projet à partir de plusieurs endroits différents: mon ordinateur portable, mon bureau au travail, et parfois de la maison. En outre, d'autres contribueront à ce projet à l'avenir.

Je voudrais que ce soit aussi simple que possible pour qu'un nouveau contributeur se lance dans le développement.

Actuellement, un nouveau contributeur passe par ces étapes:

  1. clone le dépôt
  2. cd dans les modèles dir
    1. run npm install
    2. npm link
  3. cd dans l'API dir
    1. course npm install
    2. npm link models
  4. cd dans l'application dir
    1. course npm install
    2. npm link models
  5. commencer à travailler

Ce que je voudrais faire (et je pense que npmdevrait être capable de faire) est:

  1. clone le dépôt
  2. cd dans les modèles dir
    1. exécuter npm install
  3. cd dans le api dir
    1. run npm install
  4. cd dans l'application dir
    1. run npm install
  5. commencer à travailler

Je pourrais écrire un script pour faire cela, mais cela semble être un cas d'utilisation évident pour npm et je pense qu'il est probablement capable de faire quelque chose comme ça. Je pense que je peux oublier quelque chose parce que je ne le trouve pas dans la documentation.

+0

Est-il vraiment nécessaire d'avoir trois 'package.json' séparés? Ne devriez-vous pas créer un fichier principal 'json'? Je n'ai pas été dans une situation où c'est encore un besoin –

+0

Pourquoi? NPM fait déjà la déduplication pour vous. S'il s'agit d'un projet, vous n'avez pas besoin de trois fichiers package.json, utilisez-en un seul. D'un autre côté, si ce sont trois projets différents qui sont indépendants et peuvent être publiés chacun de leur propre chef, alors bonne nouvelle: npm fera automatiquement la déduplication basée sur le lien pour vous. –

+0

Re: fichiers package.json multiples - finalement, ce code sera exécuté dans plusieurs conteneurs docker et je cherchais un moyen de s'assurer que les dépendances inutiles sont installés. Par exemple, si le conteneur d'API a besoin d'une dépendance que le conteneur d'application ne possède pas, cela semble être le moyen le plus simple d'éviter de l'installer là où il n'est pas nécessaire. – Kryten

Répondre

1

Il peut y avoir de meilleures façons de résoudre ce problème, mais ..

Une possibilité est de créer un package.json dans la racine de votre projet, qui gère toutes l'initialisation de votre projet.

package 
├── package.json 

Et le contenu du package.json n'a pas de dépendances, mais les scripts pour lier et installer les dépendances pour tous les sous-modules en utilisant seulement npm install à partir du répertoire package.

Si vous mettez ce qui suit dans un package.json dans votre dossier package

{ 
    "name": "package-name", 
    "version": "1.0.0", 
    "description": "Some description", 
    "scripts": { 
    "init-models": "cd ./models && npm install && npm link", 
    "init-api": "cd ./api && npm install && npm link", 
    "init-app": "cd ./application && npm install && npm link", 
    "postinstall": "npm run init-models && npm run init-api && npm run init-app" 
    } 
} 

Vous aurez juste besoin de npm install pour initialiser l'ensemble du projet.