lerna包管理
简述
目前项目使用lerna
来进行包管理,已经停止维护
除了lerna
以外,Rush
也是一个非常不错的工具,lerna
的停止维护目前看来是利好Rush
的
lerna
和Rush
解决的都是采用monorepo
管理模式的项目
monorepo
管理模式:monorepo
是一种将多个package
放在一个repo
中的代码管理模式,摒弃了传统的多个package
多个repo
的模式
解决的问题:
- 多个包多个项目难以维护和发布
- 模块的升级需要手动修改包信息
- 公用
npm
包的node_modules
占用大量空间
带来的问题:
- 单包的权限控制无法实现
- 单项目过大的体积
使用lerna管理的包
目前Babel, React, Angular, Ember, Meteor, Jest
等许多开源项目都使用该种模式来管理代码。
lerna基本使用
官网过于简单,结合了几篇教程以及自己的实践结果来搭一个较为完整的monorepo
安装
npm install lerna -g
初始化
初始化git
在自己的github repositories
中提前创建了一个空文件夹,并clone
下来
初始化lerna
对应文件目录下执行lerna init
, 对应生成两个文件一个文件夹
根目录的lerna.json
可以用来配置一些全局性的东西,比如npmClient
,项目使用yarn
,这里就给他配置为yarn
,pnpm
也是支持的,只需要正确配置包即可
lerna.json
1 | { |
package.json
1 | { |
创建工具包
1 | lerna create public-package |
命令执行结果
代码结果
查看
根目录下执行,即可查看自己创建的包
1 | lerna list |
创建/导入项目
注意:导入和创建项目不会被计入lerna
的包,即lerna list
不会记录创建或导入的项目
全新的项目
可以直接cd packages
去对应的包下创建文件夹npm init -y
等等,或者直接使用脚手架npx create-react-app main-app
创建新项目
已有的项目
使用如下命令
1 | lerna import <project url> |
装包
建立相互依赖的包之间的软连接并安装其他的依赖, 默认是npm i
,因为我们指定过yarn
,因此执行yarn install
,会把所有包的依赖安装到根node_modules
.
1 | lerna bootstrap |
向项目中添加依赖
1 | lerna add <dependencies> --scope=<project> |
组织Workspaces
通常起项目的时候,最好能在根目录配置对应的命令,这里可以参考yarn workspaces
的组织方法
根目录下start
命令意味着执行package.json
里name
为react-code-demo
的start
命令
根目录package.json
1 | { |
项目react-code-demo
的package.json
1 | { |
动态更新
修改包对应的代码,无需重启,无需复制,由于对应包lerna
都是软链到根目录node_modules
,修改包信息会直接同步到顶层node_modules
,因此刷新即可生效
发布
lerna
提供两个指令
1 | lerna changed |
列出下次发版lerna publish
要更新的包。
原理: 需要先git add
,git commit
提交。 然后内部会运行git diff --name-only v版本号
,搜集改动的包,就是下次要发布的,并不是网上人说的所有包都是同一个版全发布
1 | lerna publish |
首先对应的package.json
要配置publishConfig
,属于npm
相关内容不再赘述,执行命令
会打tag
,上传git
,上传npm
基本使用如下,开发者可以根据需求自定义命令,如清理node_modules
、是否需要依据package.lock.json
等安装,五花八门,等发现更有价值的持续更新。
参考链接:
Lerna 中文详解教程:https://juejin.cn/post/6844903856153821198#heading-21
lerna.js:monorepos项目管理模式简单实践: https://developer.aliyun.com/article/1007301