平时的我的项目因为依赖包不多根本都是一个依赖应用一个仓库,但如果开发较为大型的我的项目,或者我的项目组件抽出的比拟细,这种场景下一个依赖应用一个仓库就加大了治理难度。Monorepo
就是解决这样场景而产生的,像是 Babel
、Vue3
、React
都是应用这样的治理形式。
Monorepo 优劣势
劣势
1、不便代码治理
依赖数据一旦多起来时,泛滥的我的项目仓库会使得批改关联性能须要在几个仓库间切换。
依赖扩散,治理上须要更多的精力,如果不足持续性治理,可能导致功能模块定义偏差。或是各个我的项目内容易存在过多功能雷同的代码,也不不便提取复用。
如果文档整顿不全,有可能呈现交接时导致仓库遗失的状况。
2、分支构建对立
因为模块数众多,各个模块的版本治理与模块分支对应也会越来越简单。
因为模块数众多,可能因为某个小模块的代码批改而未被留神到,导致不容易检测。
3、不便复用与测试
所有依赖同在一个仓库,不便复用、批改、测试。
劣势
1、不利于权限治理
因为所有代码都放在同一个仓库,不利于做权限治理,对于我的项目不相熟的人容易批改到其余中央代码。
2、仓库体积大
因为所有代码同放一个仓库,可能有时候批改一个小性能须要拉下残缺的仓库。
如果是引入长期开发者或是新人,不利于疾速上手我的项目。
Lerna、Yarn 与 Monorepo 关系
文章题目提到 Yarn
、Lerna
这是比拟支流的 Monorepo
仓库管理工具。
Yarn
是 Facebook
为了解决 NPM
应用中诸多问题而创建的包管理工具,其中自带了 workspaces
性能,能够通过配置根目录的 package.json
来实现 Monorepo
仓库治理。然而 Yarn
只解决了包治理的问题,对于包内的依赖、发版仍然麻烦,此时就须要另一个工具Lerna
。
Lerna
就是 Babel
我的项目在包治理时发现解决依赖等诸多不便,因而产生的管理工具。
Monorepo 利用
装置
装置 lerna
和yarn
npm i -g lerna yarn
初始化我的项目
进入目录,执行初始化命令
lerna init
能够应用 --independent
参数来创立 independent
模式的我的项目。
lerna 有两种版本号管理模式:
fixed
和independent
。fixed
是默认模式,在这模式下所有包都应用lerna.json
里的version
字段值。independent
模式是每个包应用独立的版本号。
执行后在我的项目下会多出 package.json
、lerna.json
文件和 packages
目录。
packages
目录就是寄存多个我的项目的目录,在配置文件中能够批改。
在 package.json
能够增加一些配置,
"private": true, // 公有,主工程不会被公布
"workspaces": [ // 申明子 package 我的项目门路,yarn 会读取应用
"packages/*"
]
lerna.json
能够配置一些参数:
- version: 版本号
- npmClient: 应用指定的包管理器,值为
yarn
、npm
。默认为npm
- command.publish.ignoreChanges: 值为数组,配置疏忽变更的文件或目录
- command.publish.message: 自定义公布新版的提交信息,参看 @lerna/version(翻译版 @lerna/version)
- command.publish.registry: 配置公布的自定义仓库地址
- command.bootstrap.ignore: 值为数组,
lerna bootstrap
命令疏忽的包 - command.bootstrap.npmClientArgs: 值为数组,
lerna bootstrap
命令时,会将此变量值传递给npm install
- command.bootstrap.scope: 值为数组,
lerna bootstrap
命令针对哪些包执行 - packages: 值为数组,所有子包的门路
依赖治理
装置依赖
只有在我的项目主目录下执行
yarn install
yarn
会主动读取 workspace
配置,就能主动装置、解决、软链接各个子包的依赖,对立放在根目录下。
也能够应用 lerna
的装置命令
lerna bootstrap
但可能不如 yarn
的包管理机制好用,能够看这篇文章《Lerna 的依赖治理及 hoisting 浅析》
增删依赖
主我的项目增加依赖
yarn add -W -D [packageName]
-W 是指定在我的项目根目录执行命令
删除公共依赖
yarn remove -W -D [packageName]
给所有子项目增删依赖
yarn workspaces add [packageName]
yarn workspaces remove [packageName]
给某个我的项目增删依赖
yarn workspace [packageNameA] add [packageNameB] // packageNameA 是指定装置依赖的包名,packageNameB 是公共的包名或者我的项目内的包名
yarn workspace [packageName] remove [packageName]
当我的项目依赖凌乱的时候,能够应用命令清理依赖
lerna clean
其余还有一些命令
// 如果 package.json 中设置了 "private": true 的不会展现
lerna ls // 列出仓库中包信息
lerna changed // 查看我的项目变动
lerna exec // 执行命令
yarn workspaces info // 查看我的项目内信息
构建公布
应用 lerna run
命令构建我的项目
lerna run build // 会执行子包中 build 命令构建
–stream,增加此参数会输入执行时的信息
–sort,增加此参数包与包之前有相互依赖的会先进行排序,而后按程序一个个构建
–scop [packageName],增加此参数能够指定某个包执行命令
lerna
同时提供了疾速版本公布性能
lerna version
执行后会自动识别批改的包,而后批改版本号。如果以后代码有未提交的批改记录则禁止更新。
应用带 --conventional-commits
参数命令,能够反对 Git 的提交记录来自动更新版本号
lerna version --conventional-commits
具体的参数文档能够看 @lerna/version 或者 @lerna/version 翻译
之后能够用 lerna publish
公布新包
lerna publish from-git
具体的参数文档能够看 @lerna/publish 或者 @lerna/publish 翻译