首页 > 其他分享 >husky配置实现代码提交前校验与规范提交信息

husky配置实现代码提交前校验与规范提交信息

时间:2024-03-28 17:58:20浏览次数:17  
标签:git no -- 校验 eslint 提交 commit husky

husky是一个Git Hook管理工具,主要用于实现提交前eslint校验和commit信息的规范校验。

Husky 的原理是让我们在项目根目录中写一个配置文件,然后在安装 Husky的时候把配置文件和 Git Hook 关联起来,这样我们就能在团队中使用 Git Hook 了。

  1. 首先,确保已经安装了husky和commitlint。如果没有安装,可以使用以下命令进行安装:

    npm install -D husky commitlint
  2. 在项目中启用husky钩子,事实上是在项目根目录生成配置文件的文件夹(.husky)。查看.git/config,可以看到配置中修改了core.hooksPath指向为.husky

    npx husky install
  3. 项目配置文件添加配置,实现跑命令前先安装husky

    "scripts": {
        "prepare": "husky install"
    },
  4. 添加husky hook的pre-commit配置文件。执行之后会增加文件.husky/pre-commit(其中的注释是我另外添加的)。

    npx husky add .husky/pre-commit "npm run lint"
    #!/bin/sh
    # . 指令为source,表示不产生新的shell,在当前shell下执行命令,共享上下文,类似将两个文件拼接到一起
    # 执行 .husky/_/husky.sh
    . "$(dirname "$0")/_/husky.sh"
    
    npm run lint
  5. 类似的,我们也可以添加commit-msg钩子,来规范我们的commit message信息

    npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"' 
  6. package.json文件中,定义相关的指令。例如,以下是一个示例配置:

    "scripts": {
        "dev": "vite serve --mode development",
        "build": "vite build --mode test",
        "preview": "vite preview",
        "test:unit": "vitest --environment jsdom --root src/",
        "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
        "prepare": "husky install",
        "commitlint": "commitlint --config commitlint.config.js -e -V"
    },

需要确保在项目的根目录下有一个eslint.config.js文件也可以是.eslintrc.js文件(用于配置eslint)和一个commitlint.config.js文件也可以是.commitlintrc.js(用于配置commitlint)

.eslintrc.js

module.exports = {
    root: true,
    /**环境提供预定义的全局变量 */
    env: {
        /**Node.js全局变量和Node.js范围 */
        node: true,
        /**浏览器全局变量 */
        browser: true,
    },
    /**定义ESLint的解析器 */
    parser: 'vue-eslint-parser',
    parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
        parser: '@typescript-eslint/parser',
    },
    /**定义文件继承的子规范 */
    extends: ['eslint:recommended', 'plugin:vue/vue3-essential', 'plugin:@typescript-eslint/recommended', './.eslintrc-auto-import.json'],
    plugins: ['vue', '@typescript-eslint'],
    rules: {
        'no-var': 'error', //要求使用 let 或 const 而不是 var
        camelcase: 'off', // 双峰驼命名格式
        indent: ['error', 4, { SwitchCase: 1 }], //代码缩进2个空格
        semi: ['error', 'always'], //行尾需要有分号
        quotes: ['error', 'single'], //强制使用一致的反勾号、双引号或单引号
        'linebreak-style': ['error', 'windows'], //强制使用一致的换行风格,"unix":\n 表示 LF , "windows":\r\n 表示 CRLF
        // eqeqeq: ['error', 'always', { null: 'ignore' }], //比较时强制使用 === 或者 !==,但对null作比较时可以不用全等
        'no-unused-vars': 'off',
        '@typescript-eslint/no-unused-vars': [
            'warn',
            {
                argsIgnorePattern: '^_',
                varsIgnorePattern: '^_',
            },
        ], //不允许使用未使用的变量
        '@typescript-eslint/no-explicit-any': 'off', //不允许任何类型
        '@typescript-eslint/no-empty-function': 'off', //不允许空函数
        'vue/html-indent': ['error', 4], //在<template>中强制一致缩进
        'vue/singleline-html-element-content-newline': 'off', //要求在单行元素的内容之前和之后有一个换行符
        'vue/max-attributes-per-line': 'off', //执行每行的最大属性数(被 prettier 最大单行控制了暂off)
        'vue/multi-word-component-names': 'off', //要求组件名称始终为多字
        'vue/html-self-closing': 'off', //执行自我封闭式
        'no-undef': 'off', //禁用未声明的变量,除非它们在 /*global */ 注释中被提到
        '@typescript-eslint/ban-ts-comment': 'off', // 不允许@ts-<指令>评论或要求指令后的描述
        '@typescript-eslint/ban-types': 'off', // 不允许某些类型
        '@typescript-eslint/no-non-null-assertion': 'off', // 不允许使用!后缀操作符的非空断言
    },
    globals: {
        //可以定义全局中的变量的权限(只读,可读可写)
        defineProps: 'readonly',
        defineEmits: 'readonly',
        defineExpose: 'readonly',
        withDefaults: 'readonly',
        uni: 'readonly',
    },
    ignorePatterns: [
        // # 忽略目录
        '/dist',
        '/public',
        '/src/public',
        '/src/static',
        '/node_modules',
        // # 忽略文件
        '**/*-min.js',
        '**/*.min.js',
        '**/*-min.css',
        '**/*.min.css',
        '**/*.tsbuildinfo',
        '**/*.config.js',
        '**/*.config.ts',
        '/src/manifest.json',
    ],
};

commitlint.config.js

module.exports = {
  extends: [
    "@commitlint/config-conventional"
  ],
  rules: {
    'type-enum': [2, 'always', [
      'upd', 'feat', 'fix', 'refactor', 'docs', 'chore', 'style', 'revert'
     ]],
    'type-case': [0],
    'type-empty': [0],
    'scope-empty': [0],
    'scope-case': [0],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never'],
    'header-max-length': [0, 'always', 72]
  }
};

rule配置说明::rule由name和配置数组组成,如:'name:[0, 'always', 72]',数组中第一位为level,可选0,1,2,0为disable,1为warning,2为error,第二位为应用与否,可选always|never,第三位该rule的值。

commitlint 的默认格式为

# 注意:冒号前面是需要一个空格的, 带 ? 表示非必填信息,也可以根据自己项目需要自定义配置
type(scope?): subject
body?
footer?

scope 指 commit 的范围(哪些模块进行了修改)
subject 指 commit 的简短描述
body 指 commit 主体内容(长描述)
footer 指 commit footer 信息
type 指当前 commit 类型,一般有下面几种可选类型:

  • upd:更新某功能(不是 feat, 不是 fix)
  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

使用示例

控制台报错:Cannot find module "@commitlint/config-conventional" ,是因为缺少依赖,执行下面的命令

npm i -D @commitlint/config-conventional @commitlint/cli

husky给出了commit-msg的input为xxx,触发了subject-emptytype-empty两个规则,提交不符合规范,被拦了下来。 

 正确的例子:type后面要有空格

git commit -m 'feat: 增加 xxx 功能'
git commit -m 'bug: 修复 xxx 功能'

完成以上步骤后,husky就已经配置好了。在提交代码时,husky会自动执行eslint校验和commit信息的规范检查,如果存在不符合规范的情况,husky会阻止提交并给出相应的提示信息。

Git 支持的所有钩子见下表(加粗的为常用钩子

Git Hook调用时机说明
pre-applypatchgit am执行前
applypatch-msggit am执行前
post-applypatchgit am执行后不影响git am的结果
pre-commitgit commit执行前可以用git commit --no-verify绕过
commit-msggit commit执行前可以用git commit --no-verify绕过
post-commitgit commit执行后不影响git commit的结果
pre-merge-commitgit merge执行前可以用git merge --no-verify绕过。
prepare-commit-msggit commit执行后,编辑器打开之前
pre-rebasegit rebase执行前
post-checkoutgit checkoutgit switch执行后如果不使用--no-checkout参数,则在git clone之后也会执行。
post-mergegit commit执行后在执行git pull时也会被调用
pre-pushgit push执行前
pre-receivegit-receive-pack执行前
update
post-receivegit-receive-pack执行后不影响git-receive-pack的结果
post-update当 git-receive-pack对 git push 作出反应并更新仓库中的引用时
push-to-checkout当``git-receive-packgit push做出反应并更新仓库中的引用时,以及当推送试图更新当前被签出的分支且receive.denyCurrentBranch配置被设置为updateInstead`时
pre-auto-gcgit gc --auto执行前
post-rewrite执行git commit --amendgit rebase
sendemail-validategit send-email执行前
fsmonitor-watchman配置core.fsmonitor被设置为.git/hooks/fsmonitor-watchman.git/hooks/fsmonitor-watchmanv2
p4-pre-submitgit-p4 submit执行前可以用git-p4 submit --no-verify绕过
p4-prepare-changelistgit-p4 submit执行后,编辑器启动前可以用git-p4 submit --no-verify绕过
p4-changelistgit-p4 submit执行并编辑完changelist message可以用git-p4 submit --no-verify绕过
p4-post-changelistgit-p4 submit执行后
post-index-change索引被写入到read-cache.c do_write_locked_index

可以参考下这篇文章  滑动验证页面

详细说明使用husky规范前端项目搭建_husky使用-CSDN博客

标签:git,no,--,校验,eslint,提交,commit,husky
From: https://blog.csdn.net/array__/article/details/135462226

相关文章

  • 微软应用商店第三次提交失败
    第二修改提交,继续失败。失败理由如下Theproductcrasheswhenselecting日语五十音图表,练习模式or挑战模式.TheissuewasobservedonmultipledevicesrunningWindowsbuild22621.1105ObservedOn:DellLatitude5502, MicrosoftsurfacelaptopGoTestedOn:De......
  • Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签
    1方案一:命令cd<项目目录>gitfetch--allgitfetch--tagsgitremoterenameoriginold-origin#可以不保留gitremoteaddoriginhttp://***(项目的新仓库地址)#gitremoteset-urlorigin<项目的新仓库地址>gitpushorigin--allgitpush--tags有多个分支的话......
  • git提交-分支开发合并-控制台操作
    git提交-分支开发合并-控制台操作git的基本概念工作区、暂存区和版本库工作区:就是你在电脑里能看到的目录(隐藏目录.git不算工作区)。暂存区:英文叫stage或index。一般存放在本地的.git目录下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)版本库:工作区......
  • java实现crc校验
    publicintcheckCrc(byte[]inBuf,intstartIdx,intendIdx){try{intwCRCin=0x0000;intwCPoly=0xA001;for(inti=startIdx;i<endIdx;i++){wCRCin^=((int)inBuf[i]&0x00ff......
  • 更新和添加参数校验优化(2024-3-26)
    由于更新文章分类和添加文章分类,参数校验时,一个需要IDnotnull一个只是让id自动增长,所以当再次添加新的文章时会出现id为空的错误:这时候就要用到validation提供的分组校验:把校验项进行分类,在完成不同功能的时候,校验指定组中的校验项packagecom.di.bigevent.pojo;importco......
  • 动态表单校验
    单个的表单域上传递属性的验证规则记录一次动态表单嵌套动态表单,前端必填校验的问题。之前没怎么写过前端代码,看文档也不够仔细~~按常规方法写完页面之后,测试发现校验都加上去了,但是填写内容之后校验也一直在,并且添加的中文校验提示没生效,一直是英文的提示。页面大致长下面......
  • js 非常好用且优雅的步骤校验、提交校验、自定义校验写法
    很多form表单和其它场景,在提交前或进入下一步前需要校验逻辑,这里总结了一个通用方法: constform={name:'',age:20,time:['2100-01-01','2100-01-01']}constvalidForm=()=>{//校验状态总结let......
  • Android证书校验出现java.io.IOException: Invalid keystore format错误的解决方案
    使用下面命令keytool-list-v-keystore签名.keystore出现错误java.io.IOException:Invalidkeystoreformat一般出现这种错误的情况有2种可能1.密码错误2.JDK版本问题1.如果是JDK8生成的keystore,然后用JDK11(+)执行是没问题的,当前情况不需要解决,因为是成功......
  • lesson9基于GET提交的单引号闭合的时间盲注
    lesson9基于GET提交的单引号闭合的时间盲注这一关不管输入什么,页面都是显示Youarein......因此只能使用时间盲注一、手工注入1.判断注入点判断注入类型是否为数字型?id=1and1=1andsleep(5)?id=1and1=2andsleep(5)如果是数字型那么页面会延迟5秒,但是发现页面并......
  • SpringBoot如何优雅的进行参数校验
    写在前面上一篇文章中我们学会了如何优雅的接收前端参数,传送门SpringBoot如何优雅的接收前端参数接收到参数后,接下来要做的就是校验参数的合法性。这一步的重要性就不用多说了。即使前端已经对数据进行了校验,我们后端还是要再对接收到的数据进行一遍彻底的校验。这样可以避免......