节点/ NPM管理本地包

时间:2017-03-01 15:22:17

标签: node.js npm npm-link

TL; DR 如何在模块化node.js项目中配置不同的“子模块”以尽可能简单地相互引用?

我正试图围绕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目录
    1. 运行npm install
    2. npm link models
  4. cd进入应用程序目录
    1. 运行npm install
    2. npm link models
  5. 开始工作
  6. 我想做什么(我认为npm 应该能够做到的)是:

    1. 克隆存储库
    2. cd进入模型目录
      1. 运行npm install
    3. cd进入api目录
      1. 运行npm install
    4. cd进入应用程序目录
      1. 运行npm install
    5. 开始工作
    6. 我可以编写一个脚本来执行此操作,但它似乎是npm的一个明显用例,我怀疑它可能会做这样的事情。我想我可能会忽略一些东西,因为我没有在文档中找到它。

1 个答案:

答案 0 :(得分:1)

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

一种可能性是在项目的根目录中创建一个package.json,它处理项目的所有初始化。

package
├── package.json

package.json的内容没有依赖关系,但脚本只使用npm install目录中的package来链接和安装所有子模块的依赖关系。

如果您将以下内容放入package.json文件夹中的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"
  }
}

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