lerna
这个文章是笔者就自己学习lerna
过程中的学习心得以及历程的一个分享的一个文章。同时作为一个记录,方便之后自己再次使用的时候查找记录。
前言
目前的工程化仓库管理模式主要有两种: monorepo
和 multirepo
-
multirepo
该种模式主要是通过不同的独立的代码仓库进行管理。
-
monorepo
该种模式主要是通过一个单独的代码仓库,将不同的
lerna简介
Lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目。(官网自己的介绍)
初始化项目
全局安装
npm install --global lerna
初始化 git 代码
git init lerna-repo && cd lerna-repo
复制代码
初始化 Lerna
lerna init
// lerna info Creating package.json
// lerna info Creating lerna.json
// lerna info Creating packages directory
// lerna success Initialized Lerna files
此时得到了这样一个仓库目录结构:
lerna-repo/
packages/
package.json
lerna.json
其中 packages
中保存着每个独立的包模块。
安装 lerna 到仓库 node_modules 中:
npm install
至此,我们就完成了一个 Lerna 工程的初始化工作,下面我们掌握一些操作命令来管理 Lerna。
Lerna 管理命令
可查看官方文档: lerna.js.org/docs/api-re…
lerna init
将一个仓库初始化为 lerna 仓库
lerna init
lerna init --independent/-i – 使用独立的版本控制模式
lerna create 「package」
创建一个 package 到项目工程的 packages 下
lerna create package-1
lerna add 「module」
为指定的package安装一来
lerna add react-dom packages/package1
// or
lerna add react-dom --scope=package1
- 添加依赖到根目录 node_modules 中:
npm install typescript -D
- package 之间的相互依赖(会在 package/package.json 下添加该依赖):
lerna add package2 --scope package1
// or
lerna add package2 packages/package1
lerna publish
npm 包版本发布
lerna publish
# lerna version + lerna publish from-git
# lerna version 是去读取 lerna.json 中的 version 值
lerna publish from-git
# 发布当前 commit 中打上 annoted tag version 的包
lerna publish from-packages
# 发布 package 中 pkg.json 上的 version 在 registry(高于 latest version)不存在的包
lerna bootstrap
将 packages 链接在一起,同时安装 package 下的依赖到 package/node_modules
lerna add
时也发现了,为某个 package 安装的包被放到了这个 package 目录下的 node_modules 目录下。这样对于多个 package 都依赖的包,会被多个 package 安装多次,并且每个 package 下都维护 node_modules ,也不清爽。于是我们使用 --hoist 来把每个 package 下的依赖包都提升到工程根目录,来降低安装以及管理的成本
lerna bootstrap --hoist
为了省去每次都输入 --hoist 参数的麻烦,可以在 lerna.json 配置:
{
"command": {
"bootstrap": {
"hoist": true
}
},
}
lerna clean
删除各个包下的 node_modules
lerna ls
列出当前 Lerna 仓库中的所有公共软件包(public packages)
lerna run 「script」
运行包下面的script
lerna run test
lerna run test --scope package1 // 具体某个包下面的
lerna exec 「script」
允许去执行 shell 脚本
lerna exec webpack
lerna changed
检查自上次发布以来哪些软件包被修改过。
lerna link
链接互相引用的库
lerna info
查看 lerna 及运行环境的信息。
Lerna 配置文件
在 lerna.json 配置文件内可以指定工作模式、packages 的位置以及一些命令的默认参数定义,如下示例:
{
"version": "1.0.0", // 当前仓库的版本,Independent mode 请设置为 independent;
"npmClient": "yarn", // 允许指定命令使用的client, 默认是 npm, 可以设置成 yarn;
"useWorkspaces": true, // 使用 yarn workspaces 管理 Monorepo;
"packages": [ // 指定包所在的目录,支持指定多个目录;
"packages/*"
],
"command": {
"bootstrap": {
"npmClientArgs": [ // 指定默认传给 lerna bootstrap 命令的参数
"--no-package-lock"
]
},
"version": {},
"publish": {
"npmClient": "npm",
"ignoreChanges": [ // 指定那些目录或者文件的变更不用触发 package 版本的变更;
"**/*.md",
"**/test/**"
],
"message": "chore(release): publish", // 执行发布版本更新时的生成的 commit message;
"registry": "https://registry.npmjs.org", // 指定发布到的 registry url,比如可以发布到指定私服,默认是 npmjs.org;
"conventionalCommits": true // lerna version 将生成 CHANGELOG.md files(如果设置了这个,lerna 管理模式将直接使用固定模式,version = independent 的配置将失效)。
}
}
}
报错集合
lerna publish的时候产生的错误
1. lerna ERR! fatal: tag 'v0.0.2' already exists
本地的git有打了 v0.0.2的标签
2. lerna ERR! E404 Scope not found
需要在npm的项目中organization添加一个组织
参考文章:
- juejin.cn/post/709782… (lerna + yarn workspace 使用总结)
- zhuanlan.zhihu.com/p/391887059 (现代前端工程化——探秘 monorepo 仓库管理方式)
- segmentfault.com/a/119000001…(Monorepo——大型前端项目的代码管理方式)
- juejin.cn/post/684490… (lerna+yarn workspace+monorepo项目的最佳实践)
- juejin.cn/post/696954… (基于 lerna 的多包 JavaScript 项目搭建维护)
- juejin.cn/post/684490… (基于 Lerna 管理 packages 的 Monorepo 项目最佳实践)
- lerna.js.org/docs/introd… (官方文档)