安装
全局安装 lerna: npm install -g lerna
指令备查
指令 | 描述 |
---|---|
lerna bootstrap --hoist | 安装依赖 |
lerna clean | 删除各个包下的node_modules |
lerna init | 创建新的lerna库 |
lerna list | 显示package列表 |
lerna changed | 显示自上次relase tag以来有修改的包, 选项通 list |
lerna dif | 显示自上次relase tag以来有修改的包的差异, 执行 git diff |
lerna exec | 在每个包目录下执行任意命令 |
lerna run | 执行每个包package.json中的脚本命令 |
lerna add dt-ui --scope=brandowner | brandowner添加dt-ui作为依赖库使用 |
lerna add axios --exact --scope=dt-ui | 增加第三方包依赖 |
lerna add axios --dev --exact --scope=dt-ui | 增加第三方打包依赖 |
lerna import | 引入package |
lerna link | 链接互相引用的库 |
lerna create loc | 新建项目 loc是创建位置,默认是packages |
lerna publish | 发布 |
lerna version --amend --no-private --yes | 更改自上次发布以来的包版本号 |
实战演练
-
初始化项目
创建 lerna-ui 空文件夹,初始化 lerna init:mkdir lerne-ui && cd lerne-ui && lerna init
修改lerna.json
中的version
配置为independent
-
创建子项目
进入 packages 目录,执行
npx create-react-app ui-web --typescript
npx vue create ui-example
项目创建完毕后,
ui-web
和example-web
中同时出现node_modules
,二者会有很多重复部分,并且会占用大量的硬盘空间。 -
提取共同依赖
执行lerna clean
删除子项目的node_modules
,然后执行命令lerna bootstrap --hoist
。lerna bootstrop --hoist
会将packages
目录下的公共模块包抽离到最顶层 ,此时项目就公用相同的依赖了。但这里会有个问题, 不同版本号只会保留使用最多的版本,这种配置不太好,当项目中有些功能需要依赖老版本时,就会出现问题。
-
yarn workspaces 解决不同项目依赖不同版本号的问题**(验证未通过)**
在lerna.json
中增加以下配置"npmClient": "yarn", // 指定 npmClent 为 yarn "useWorkspaces": true // 将 useWorkspaces 设置为 true
在顶层
package.json
中增加配置{ "workspaces":[ "packages/*" ] }
增加了这个配置后 不再需要
lerna bootstrap
来安装依赖了,可以直接使用yarn install
进行依赖的安装。注意:yarn install
无论在顶层运行还是在任意一个子项目运行效果都可以yarn workspaces
会检查每个子项目里面依赖及其版本,如果版本不一致都会保留到自己的node_modules
中,只有依赖版本号一致的时候才会提升到顶层。 -
启动子项目
笨方法:进入packages/子项目目录
,执行yarn start
lerna 的方法:
在顶层package.json
中进行配置script
"scripts": { "web": "lerna exec --scope example-web -- yarn start", }
在顶层
lerna.json
中增加配置{ "npmClient": "true" }
-
模块引用
在项目 example-web 中增加 ui-common 模块依赖:
lerna add ui-common --scope=example-web
-
发布
lerna publish
注意版本号维护问题
参考链接:
Lerna 文档
Lerna 指令
现代前端工程化-彻底搞懂基于 Monorepo 的 lerna 模块(从原理到实战)