关于 husky7 的配置

954 阅读2分钟

关于 husky7 的配置

今天在使用husky + commitlint + lint-staged搭建项目的时候发现 husky 已经升级到了 7.x, 并且 husky7 的配置相比于之前的版本有破坏性的更改, 于是记录了一下相关的配置过程.

配置 eslint

eslint配置可以根据项目情况自行配置, 这边只是做个演示.

安装 eslint

# 安装eslint
npm install eslint -D

使用命令npm init @eslint/config生成配置文件.

这边以我的简单配置为例:

// .eslintrc.js
module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: ["eslint:recommended"],
  parserOptions: {
    ecmaVersion: "latest",
    sourceType: "module",
  },
  globals: {
    module: false,
  },
  rules: {},
};

安装依赖

npm install husky -D
npm install lint-staged -D
npm install @commitlint/cli @commitlint/config-conventional -D

配置 commitlint

在根目录下新建commitlint.config.js文件并且写入配置

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

配置 lint-staged

在根目录下新建.lintstagedrc.json文件并且写入配置

// .lintstagedrc.json
{
  "*{js,ts}": ["eslint --color"]
}

配置 husky

package.json中添加prepare脚本, 或者执行命令npm set-script prepare "husky install":

# 添加prepare脚本
npm set-script prepare "husky install"
# 执行prepare命令
npm run prepare

prepare脚本会在项目根目录生成.husky文件夹, 这里包含了git hooks的相关配置.

commitlintlint-staged相关钩子写入.husky文件夹中:

npx husky add .husky/pre-commit "npx lint-staged --allow-empty $1"
npx husky add .husky/commit-msg "npx commitlint --edit $1"
# 这两个命令在有的命令行工具可能并不能正常工作, 可以尝试以下命令
npx husky add .husky/commit-msg \"npx commitlint --edit '$1'\"
npx husky add .husky/commit-msg 'npx commitlint --edit "$1"'
yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'

上面两个脚本执行后会在.husky 内创建两个文件:

有的终端可能不会把$1正确写入到文件中, 如果缺失了请手动补充下

# .husky/commit-msg
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx commitlint --edit $1

# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged --allow-empty $1

如果这边还有其他一些需要通过git hooks去校验的可以直接添加在对应文件中, 比如需要添加一个test命令:

# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged --allow-empty $1
npm test

测试

新建测试文件, 随便写一点eslint检测无法通过的代码进行测试:

// src/index.js
const temp = "hello world";
// 'temp' is assigned a value but never used.

如果此时进行git commit, 会通过git hooks检测是否有eslint报错:

pre-commit报错

如果修复所有eslint报错后, 使用不规范的commit message进行提交也会报错:

commit-message报错

使用规范的commit message提交就能成功了

成功

最后附上本文的 demo:

项目 demo

参考

Commit message 和 Change log 编写指南

commitlint

husky 使用总结

husky7 + commitlint + lint-staged 记录