2017-03-01 65 views
0

TL; DR如何在模块化项目中配置不同的“子模块”以尽可能简单地相互引用?节点/ NPM管理本地包

我试图围绕NPM的本地包裹头,特别是因为他们涉及到一个模块化项目。

我正在构建一个具有前端和后端API的Web应用程序。这些需要共享一个输出简单模型的包。我的项目目录结构是这样的:

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> 

这两个API和应用项目将使用模型,所以我抽象我的项目中的代码到一个单独的子模块。

我已阅读npm link的文档,这似乎是正确的方法,因为据我了解,它符号链接node_modules目录中的程序包。这样可以访问现在存在的代码,而不是在node_modules中安装副本。听起来像我需要的,但有一个皱纹:我正在从几个不同的地方开展这个​​项目:我的笔记本电脑,我的办公室在工作,偶尔从家里。此外,其他人将在未来为这个项目做出贡献。

我想尽可能简单地让一个新的贡献者在开发中运行起来并运行。

目前,一种新的贡献者会经过以下步骤:

  1. 克隆库
  2. cd到车型目录
    1. 运行npm install
    2. npm link
  3. cd到API DIR
    1. 运行npm install
    2. npm link models
  4. cd到应用程序目录
    1. 运行npm install
    2. npm link models
  5. 开工

我想什么做的(我认为npm应该是能够做到的事情)是:

  1. 克隆库
  2. cd到车型目录
    1. 运行npm install
  3. cd到API目录
    1. 运行npm install
  4. cd到应用程序目录
    1. 运行npm install
  5. 开工

我可以写一个脚本来做到这一点,但它似乎是一个明显的用例npm,我怀疑它可能能够做到这样的事情。我想我可能会忽略一些东西,因为我没有在文档中找到它。

+0

真的需要有三个独立的'package.json'吗?你不应该只创建一个主'json'文件吗?我还没有处于需要的状态 –

+0

为什么? NPM已经为你做了重复数据删除。如果这是一个项目,则不需要三个package.json文件,只需使用一个。另一方面,如果这三个独立项目是独立的并且可以各自独立发布,那么好消息是:npm已经可以自动为您执行基于链接的重复数据删除。 –

+0

Re:多个package.json文件 - 最终,这些代码将在多个docker容器中运行,我正在寻找一种方法来确保安装不必要的依赖关系。例如,如果API容器需要应用程序容器没有的依赖项,这似乎是避免将其安装在不需要的地方的最简单方法。 – Kryten

回答

1

可能有更好的方法来解决这个问题,但..

一种可能性是创建项目中,负责处理所有项目的初始化的根package.json

package 
├── package.json 

而且package.json的内容没有依赖性,但脚本使用刚刚npm installpackage目录下的所有子模块的链接和安装依赖。

如果你把一个package.jsonpackage文件夹下面

{ 
    "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" 
    } 
} 

你只需要npm install初始化整个项目。