场景还原

  1. 普通的单个仓库想要启用 git hook, 可以比较简单的使用 yorkie 或 husky (后面会讲 yorkie 和 husky 的区别)来添加 hook
  2. Monorepo 有多个 package,怎么对每个 package 执行 hook 呢?

    1. 第一种,就是只在根目录使用 hook,这样每个 package 里都会使用相同的脚本来执行各种 lint。这种很好实现,这里以 york 和 lint-staged 为例。首先,在根目录安装这两个库和各种 lint 工具,比如 eslint/prettier,然后配置这些lint工具。

      1. // root package.json
      2. {
      3. "gitHooks": {
      4. "pre-commit": "lint-staged"
      5. },
      6. "lint-staged": {
      7. "*.{js,jsx,vue}": [
      8. "vue-cli-service lint",
      9. "git add"
      10. ],
      11. "*.ts": [
      12. "prettier --write"
      13. "eslint --fix"
      14. ]
      15. }
      16. }
    2. 第二种,各 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” ] } } ```

yorkie 和 husky 的不同和原理