CSDN 中文章不一定能及时更新,欢迎点击前往我的博客查看最新版本:许盛的博客
最近学了不少组件化相关的知识,需要编写一些 cli
工具、公共组件之类的,和以往大量的做业务项目,走 CI/CD
容器化部署不同,这类项目不需要容器化部署到某个平台,而是使用 npm publish
来发布。
正好学习学习 monorepo
的思想和 lerna
的使用,本文不讲概念,只是记录一下流程,作为个人的备忘录使用,忘记了就再来翻一翻。
初始化目录
首先创建项目,并安装相应的依赖
mkdir my-app && cd my-app
yarn init -y
yarn add -D lerna # 安装 lerna 为开发依赖
lerna init # 调用 lerna 初始化命令,生成 lerna.json 文件,创建 packages 目录
修改配置文件
执行 lerna init
命名后会生成默认的 lerna.json
文件,内容如下:
{
"packages": [
"packages/*"
],
"version": "0.0.0"
}
默认情况下 lerna
并不会使用 yarn workspaces
,我们需要修改下配置:
{
"packages": [
"packages/*"
],
"version": "independent", // 每个包版本独立
"npmClient": "yarn",
"useWorkspaces": true, // 使用 yarn workspaces
"message": "chore(release): publish" // lerna version 默认使用的 commit message 不符合 conventional commit 规范,修改一下
}
同时将 package.json
中的 private
字段设置为 true
,加入 workspaces
字段,并删除 version
、 main
等无用字段:
{
"private": true,
// 避免 root 被发布出去
"workspaces": [
"packages/*"
]
}
创建 package
可以使用 lerna create
命令快速创建新的 package
:
lerna create my-package -y
在新建的 package
的 package.json
文件中,加入 publishConfig
字段:
{
...
"publishConfig": {
"access": "public" # 带 scope 的包需要设置为 public
}
}
安装依赖
默认所有依赖都会被安装在根目录下的 node_modules
中,如果不同 package
的依赖有版本冲突问题,就会放在 package
的 node_modules
中。
根目录下有一个 package.json
文件,各个 package
中又有自己的 package.json
文件,这时候其实依赖也可以分为全局和包两种级别了。
对于 devDependencies
依赖,装在全局还是包中其实区别不大,只是放在根目录下的 package.json
中方便统一维护版本,避免重复安装。
如果不同包对于某个 devDependencies
依赖没有特定的版本要求的话,建议直接装在根目录下。
但是 dependencies
就需要注意一下了, lerna
在发布时,会直接将 package
下的 package.json
原封不动发布出去,如果把 dependencies
写在根路径下的 package.json
中,开发的时候没有问题,但是发布出去被别人引用时,就缺失依赖了。
所以结论就是,对于 devDependencies
依赖,建议尽量装在根目录下:
yarn add -D -W <some-dev-dependency>
对于 dependencies
,在各个 package
中自行维护:
yarn workspaces <some-package> add <some-dependency>
执行命令
使用 yarn workspaces
的一个好处,就是可以快速调用所有 package
的某个命令,例如:
yarn workspaces run clean # 调用所有 package 的 clean 命令
所以可以在根目录的 package.json
中加入一些常用的命名:
{
"scripts": {
"build": "lerna run --stream --sort build", // 按照依赖拓扑进行构建
"clean": "yarn workspaces run clean", // 彼此独立,可以并行执行
"test": "yarn workspaces run test"
}
}
常用命令
# 使用 lerna 标记版本,会根据哪些文件有变动,来提示你将哪些包的版本进行修改
# 并进行一次 git commit 提交,打上相应的 git tag
# 1. 更新包版本
# 2. git commit 和 git tag
# 3. 推送到 remote
lerna version
# 在上一步的基础上,生成 changelog 文件,以及根据 commit 来自动进行版本变动
lerna version --conventional-commits --yes
# lerna version 成功后,就可以使用 publish 命令发布到 npm 仓库中了
# 相当于 lerna version + lerna publish from-git
lerna publish
# 发布当前 commit 中打上 tag version 的包
lerna publish from-git
# 发布 package.json 中的 pkg.json 上的 version 在 registry(高于 latest version) 不存在的包
lerna publish from-packages