multiRepo Vs monoRepo
lerna 简介
Lerna是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题
- 多仓库管理
- 多包管理
- 自动管理包依赖
lerna 常用命令
// 安装
npm i -g lerna
// 创建目录
mkdir lerna-repo && code lerna-repo
// 初始化
lerna init // 默认fixed,包版本号统一管理
lerna init -i // 独立模式,包版本单独管理
// 启动项目(如果项目是从git下载的,而不是第一次新建)
lerna bootstrap // 安装所有packages的依赖项并且连接本地包的交叉依赖项
lerna bootstrap --hoist // 将各包中相同的依赖提取到根 node_modules, 最好先lerna clean删除各包依赖
// 创建package
// 也可以在packages目录下手动创建
lerna create <packageName> -y // 通过lerna 快速创建
// 安装依赖
// 将本地或者远程的包作为依赖项添加到当前的packages中,每次只能添加一个包
lerna add axios // 如果使用 Workspaces,各个包都安装一遍
lerna add axios --scope=<package-name> // 安装到指定的包中,--scope 指定需要安装的包名
// 删除所有包下面的node_modules目录,也可以删除指定包下面的node_modules。
// 注意: 不会删除package.json里面的依赖项定义,也不会删除root目录的node_modules
lerna clean
lerna clean --scope=<package-name>
// 列出所有公开的包(排除private=true的)
lerna list
lerna list --json // json形式
// 检查自上次发布以来有哪些包有更新
lerna changed
// 查看自上次发布以来的所有包或者指定包的git diff变化
lerna diff
// 在包含该脚本命令的每个package内部执行npm script脚本命令,也可以指定在某个package下执行
lerna run
lerna run build --scope=feu-ui
// 在每个包中执行任意命令,也可以指定在某个package下执行
lerna exec
lerna exec -- npm view \$LERNA_PACKAGE_NAME
// 将相互依赖的所有包Symlink链接在一起
lerna link
// 版本更新
lerna version
// 发布包
// 不会发布标记为私有(package.json中private=true)的包
// 代码必须先提交到 `git`
// 必须登录 `npm`
lerna publish
// 显示发布当前提交中标记的包,类似于先独立执行lerna version后,再执行此命令进行发布
lerna publish from-git
//显示发布npm registry中不存在的最新版本的包
lerna publish from-package
// 导入
// 将本地的包导入到指定目录
lerna import ~/Users/desktop --dest=package-name
复制代码
设置yarn useWorkspaces
- 默认是npm, 而且每个子package都有自己的
node_modules
,通过这样设置后,只有顶层有一个node_modules
- 通过使用
workspace
,yarn install
会自动的帮忙解决安装和link问题
yarn install # 等价于 lerna bootstrap --npm-client yarn --use-workspaces
复制代码
lerna.json
"npmClient": "yarn", // 指定使用yarn,默认npm
"useWorkspaces": true // 使用工作区域
复制代码
package.json
"workspaces": [
"packages/*"
]
复制代码
lerna add axios
- axios 安装到根目录的
node_modules
- axios 依赖写入各包的
package.json
中
注意事项
lerna-repo
根目录是管理包的并不需要发布,lerna-repo、package.json
设置"private": true
lerna-repo/packages
目录下才是需要发布的包,不需要发布的也设置"private": true
- 通过使用workspace,yarn install会自动的帮忙解决安装和link问题
- 发布
@scope
包
// 在需要发布的子包下设置,而不是根目录的 package.json
{
"name": "@vtian/package-name",
"publishConfig": {
"access": "publish" // 如果该模块需要发布,对于scope模块,需要设置为publish,否则需要权限验证
// "registry": "https://[registry-url]" // 不要在子包中设置发布地址,在根目录的package.json中设置。会导致发布失败
}
}
复制代码
- 如果发布的是私仓,可能还需要配置
// .npmrc文件
egistry = https://[registry-url]
复制代码
lerna.json 完整配置文件
{
"version": "1.1.3",
"npmClient": "npm",
"command": {
"publish": {
"ignoreChanges": ["ignored-file", "*.md"],
"message": "chore(release): publish",
"registry": "https://npm.pkg.github.com"
},
"bootstrap": {
"ignore": "component-*",
"npmClientArgs": ["--no-package-lock"]
}
},
"packages": ["packages/*"]
}
复制代码
参数说明:
- version 当前库的版本号,独立模式下,此参数设置为independent
- npmClient 允许指定命令使用的client, 默认是npm, 可以设置成yarn
- command.publish.ignoreChanges 可以指定那些目录或者文件的变更不会被publish
- command.publish.message 指定发布时提交的消息格式
- command.publish.registry 设置npm包发布的注册地址
- command.bootstrap.ignore 设置执行lerna bootstrap安装依赖时不受影响的包
- command.bootstrap.npmClientArgs 指定在执行lerna bootstrap命令时传递给npm install的参数
- command.bootstrap.scope 指定那些包会受 lerna bootstrap 命令影响
- packages 指定包所在目录
适用场景
- 工具包
- 公共ui组件库
- 前端微服务项目
项目地址
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END