Talk is cheap. Show me your code

使用 Husky + Commitlint + Lint-staged 约束每一次 Git 提交

每一名开发人员都有自己独特的代码风格。但对于多人协作项目,保持统一的风格有利于项目维护。

我们可以在项目中引入 ESLint、Prettier 来规范代码,但这无法约束 Git commit message

这时候可以借助 Husky 等工具来把好最后一关

 

常用工具

1. eslint (https://github.com/eslint/eslint)

  JavaScript 代码检测工具,检测并提示错误或警告信息

2. prettier (https://github.com/prettier/prettier)

  代码格式化工具,更好的代码风格效果

3. husky (https://github.com/typicode/husky)

  Git hooks 工具, 可以在执行 git 命令时,执行自定义的脚本程序

4. lint-staged (https://github.com/okonet/lint-staged)

  对暂存区 (git add) 文件执行脚本

5. commitlint (https://github.com/conventional-changelog/commitlint)

检测 git commit 内容是否符合定义的规范

 

 

一、Husky

Husky 是一款 Git Hooks 工具,可以在执行特定的 git 命令时(如: git commit, git push)触发对应的脚本

安装: (当前版本 7.x)

$ npm i -D husky
$ npx husky install
$ npm set-script prepare "husky install"

执行以上代码之后,项目的根目录会多出一个 .husky 文件夹,并且 package.json 中会增加一个脚本执行命令

// package.json
{
  "scripts": {
    "prepare": "husky install"
  }
}

// prepare 会在每次 npm install 的时候执行

现在 husky 已经安装好了,接下来添加对应的钩子函数

比如我需要在每次 git commit 提交前执行某些操作,就可以添加一个 commit-msg 钩子

npx husky add .husky/commit-msg 'npm test'

然后 .husky 目录下就会增加一个 commit-msg 文件

这样每一次 git commit 都会执行一次 npm test

// 如果面临特殊情况,需要绕过 Git Hooks,可以使用 --no-verify  

 

 

二、 Commitlint

Commitlint 可以校验 git commit message, 只有规范的 commit message 才能提交

安装: (当前版本 16.x)

npm i -D @commitlint/{config-conventional,cli}

然后在项目根目录新建一个 commitlint.config.js 文件

// commitlint.config.js
module.exports = { extends: ['@commitlint/config-conventional'] };

上一节已经在项目中引入了 Husky,修改一下 commit-msg 脚本,在每次 git commit 的时候执行 commitlint 校验

npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1'
# or
yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'

完成以上配置之后,只有满足规范的 commit message 才能提交(具体的规范可以查看文档

不满足规则的提交会报错,比如:

 

 

三、Lint-staged

在提交的代码的时候,可以通过 ESLint、Prettier 等工具来格式化代码

但如果直接处理全部代码,首先是可能存在性能问题,其次是可能会修改掉别的同事的代码

这时可以引入 lint-staged,它可以过滤出 Git 代码暂存区文件,这样就不会影响到未更改的文件

 

安装: (当前版本 12.x)

npm i -D lint-staged

然后在项目根目录创建文件 .lintstagedrc,配置所需要的规则

比如对暂存区的文件做格式化:

{
  "*.{js,jsx,less,md,json}": [
    "prettier --write"
  ],
  "*.ts?(x)": [
    "prettier --parser=typescript --write",
    "eslint --quiet"
  ]
}

甚至对特定文件执行脚本:

{
  "src/locales/zh-CN.ts": [
    "npm run your-command"
  ]
}

最后通过 Husky 来执行 lint-staged

npx husky add .husky/pre-commit 'npx lint-staged'

 

 

posted @ 2022-04-08 10:46  Wise.Wrong  阅读(1710)  评论(0编辑  收藏  举报