555 字
3 分钟
monorepo

monorepo 和 mutirepo 的对比#

  • monorepo,使用一个 Git 仓库管理项目相关的多个 模块/包/功能/应用。
  • multirepo(又称为 polyrepo),使用多个 Git 仓库分别管理项目的每一个 模块/包/功能/应用

使用步骤:#

Step0:全局安装 yarn#

npm install yarn --global

Step1:配置 package.json#

在根目录下使用yarn init创建一个 packages.json 的文件

根目录下包含所有 devDependencies 开发依赖,所以不需要在子 packages.json 文件中重新声明开发依赖,但是不包括生产依赖 dependencies,生产依赖在子 packages.json 文件中声明

配置如下:

{
  "name": "dayancloud",
  "version": "1.0.0",
  "license": "MIT",
  "private": true, // 定义了本项目为私有项目
  "workspaces": ["packages/*"] // 定义了每个 package 的位置
}
TIP
  • 通常使用 1.0 版本
  • yarn 需要设置 private: true
  • 在 workspaces: []数组中定义相关的包,这里是指所有的包都位于 packages/*

Step2:配置 packages#

在对应的包内配置 packages,按照规范命名,如果有互相依赖的包,需要在 packages 中的 dependencies 添加一下,如下:

{
  "name": "@dayancloud/common",
  "version": "0.1.0",
  "private": true,
  ...
}
{
  "name": "@dayancloud/main",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@dayancloud/common": "0.1.0",
  	...
	}
  ...
}

Step3:安装 & 运行#

使用yarn install安装依赖,运行对应的包 例如为 project1 添加 vue 依赖,首先要在 project1 项目中初始化 packages.json,然后根据需要执行下面任意命令:

  • 依赖选项属性会放到根目录里的 package.json
yarn add vue
  • 依赖选项属性会放到 project1 里的 package.json
yarn workspace project1 add vue

如果真想让某个项目的所有依赖只安装于自己的项目,可以在根目录的 packages.json 配置 nohoist 选项,这样 project1 的依赖将会放到自己的目录, 但其它项目则无法再引用 project1 的依赖包

{
  ...
  "nohoist": [
    "/project1//*"
  ],
  ...
}

其它#

如何使用 Yarn Workspaces 配置一个 Monorepo JS/TS 项目#

https://zhuanlan.zhihu.com/p/399002531

Monorepo 一大优势是在同一 monorepo 项目下的不同 packages 可以相互引用#

Lerna#

Lerna 是一个优化使用 git 和 npm 管理多包存储库的工作流工具,用于管理具有多个包的 JavaScript 项目,可以一键把代码提交到 git 和 npm 仓库

npm install --global lerna
lerna init

初始化完成会在项目根目录创建 lerna.json 文件

monorepo
https://www.hzhi.top/posts/monorepo/
作者
Jim的独立博客
发布于
2023-07-14
许可协议
CC BY-NC-SA 4.0