Monorepo 是针对单仓库、多 package 的流行解决方案, lerna 是它的一种实现。
说明
重要package版本说明:
- “husky”: “^6.0.0”
- “lint-staged”: “^10.5.4”
- “@commitlint/cli”: “^12.0.1”
- “@commitlint/config-conventional”: “^12.0.1”
- “cz-customizable”: “^6.3.0”
配置husky
在lerna项目根目录中安装husky
:
1 | yarn add husky -D |
注意:husky v4和v6版本的配置方式大相径庭,这里只介绍v6版本的配置方式,v4的网上一搜一大把,这里不过多介绍
- 在
package.json
的scripts
中添加"prepare": "husky install"
,并运行这条命令:
1 | npm set-script prepare "husky install" && npm run prepare |
- 添加一个hook:
1 | npx husky add .husky/pre-commit "npm test" |
上面这个命令会在.husky
目录下新建一个pre-commit
文件,其内容如下:
1 |
|
以上都是手动安装husky
的过程,当然官方也提供了一键安装和配置脚本,推荐使用:
1 | npx husky-init && npm install # npm |
如果使用的是v4版本的husky
,想升级到v6,可以使用以下命名,一键迁移:
1 | // npm |
更多配置,详见官方文档:https://typicode.github.io/husky/#/
配置lint-staged
在lerna
项目中,由于所有子项目公用一个 repo 源代码仓库,因此它的 husky 钩子只能建立在最顶层目录;
而每次 commit 都很有可能是多个子项目都有改动,这个时候使用 lint-staged
时,就不但要区分文件类型,还要区分改动文件所在的子项目(因为不同的子项目可能会有不同的校验处理)。
这时,我们可以使用 lerna 命令来实现对“哪个子项目有修改”的判断;而 lint-staged
就需要安装在任何一个需要做校验的子项目中。
- 添加或修改
.husky
目录下的pre-commit
钩子如下:
1 | #!/bin/sh |
其中,precommit
是在pre-commit
钩子中触发的子项目的命令
- 在子项目中安装和配置
lint-staged
,并添加precommit
命令
- 安装
lint-staged
:
1 | lerna add lint-staged --scope=xxxx -D |
- 在添加
precommit
命令:
1 | "precommit": "lint-staged" |
- 配置
lint-staged
:
1 | "lint-staged": { |
更多配置,详见官方文档:https://github.com/okonet/lint-staged#readme
配置commitlint和cz-customizable
每个团队对提交的commit message格式有约定俗称的要求,但是没有一个统一的规范,导致大家提交的commit message或多或少不太一样。因此,需要一个工具来帮助大家统一commit message的格式,也方便后续的分析和拓展。
cz-customizable
是一个帮助书写commit message的工具,而commitlint
是一个校验commit message的工具。
- 安装
commitlint
和cz-customizable
:
1 | yarn add @commitlint/cli @commitlint/config-conventional cz-customizable -D |
- 添加
commit-msg
钩子
1 | npx husky add .husky/commit-msg "yarn commitlint --edit" |
生成如下文件:
1 |
|
- 在
package.json
中添加以下配置:
1 | { |
- 在项目根目录中新建
.cz-config.js
文件,内容如下:
1 | module.exports = { |
- 在项目根目录中新建
.commitlintrc.js
文件,内容如下:
1 | const typeEnum = require('./.cz-config'); |
配置完成后,每次提交commit时,可以使用git cz
替换git commit
命令,从而辅助我们更加规范的书写commit message。
更多详细配置,可以参考这篇文章:https://juejin.cn/post/6844903831893966856
总结
以上就是我对如何在lerna项目中配置husky、lint-staged和Cz工具的一些粗略认知,当然不仅仅是lerna项目,也适用于任何前端项目。