场景还原
- 普通的单个仓库想要启用 git hook, 可以比较简单的使用 yorkie 或 husky (后面会讲 yorkie 和 husky 的区别)来添加 hook
Monorepo 有多个 package,怎么对每个 package 执行 hook 呢?
第一种,就是只在根目录使用 hook,这样每个 package 里都会使用相同的脚本来执行各种 lint。这种很好实现,这里以 york 和 lint-staged 为例。首先,在根目录安装这两个库和各种 lint 工具,比如 eslint/prettier,然后配置这些lint工具。
// root package.json
{
"gitHooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"*.{js,jsx,vue}": [
"vue-cli-service lint",
"git add"
],
"*.ts": [
"prettier --write"
"eslint --fix"
]
}
}
第二种,各 package 跑不同的 lint,并且由各 package 自定义。这种需求是很常见的,比如一个仓库是 ts 的,一个是 js 的,一个用 vue 来写,一个用 react 来写。这种只需要在根目录安装 yorkie,然后添加一个勾子,调用所有 package 的 lint 命令。 ```javascript // root package.json { “gitHooks”: { “pre-commit”: “lerna run lint-staged” } }
// pkg1 package.json 一个vue项目 { “scripts”: { “lint-staged”: “lint-staged” }, “lint-staged”: { “*.{js,jsx,vue}”: [ “vue-cli-service lint”, “git add” ] } }
// pkg2 package.json 一个脚手架项目 使用nodejs { “scripts”: { “lint-staged”: “lint-staged” }, “lint-staged”: { “*.js”: [ “prettier —write”, “eslint —fix” ] } } ```