记录一下在项目中集成commitizen、git-cz、@commitlint/{cli,config-conventional}以及husky

前言

心血来潮想约束下项目中的git commit规范。但由于平时没有整理文档的习惯,导致在集成相关插件时踩了一些坑,浪费许多宝贵的划水时间😭。因此痛定思痛,将集成commitizen、git-cz、@commitlint/{cli,config-conventional}以及husky的过程记录下来。

文章整体偏流水账,希望按照本文步骤大家都能够快速且顺利的集成这些插件🙏。

网上有许多关于commit规范的文章,本文没有提及,感兴趣可以再另外了解。eslint、stylelint等代码规范插件可能因项目而异,故本文也没有提及。

规范commit

  1. 安装commitizen
shell 复制代码
npm i commitizen --save-dev -save-exact
  1. 安装git-cz
shell 复制代码
npm i git-cz --save-dev --save-exact
  1. 添加changelog.config.js
javascript 复制代码
module.exports = {
  disableEmoji: false,
  format: '{type}{scope}: {emoji}{subject}',
  list: [
    'feat',
    'fix',
    'style',
    'chore',
    'perf',
    'refactor',
    'docs',
    'test',
    'revert',
    'build',
    'ci',
    'release',
  ],
  maxMessageLength: 64,
  minMessageLength: 3,
  questions: ['type', 'scope', 'subject', 'body', 'breaking', 'issues'],
  scopes: ['proj', 'module', 'comps', 'store', 'utils'],
  types: {
    feat: {
      description: 'A new feature',
      emoji: '🚀',
      value: 'feat',
    },
    fix: {
      description: 'A bug fix',
      emoji: '🐛',
      value: 'fix',
    },
    style: {
      description: 'Markup, white-space, formatting, missing semi-colons...',
      emoji: '💄',
      value: 'style',
    },
    chore: {
      description: 'Build process or auxiliary tool changes',
      emoji: '🤖', // 当前类型的commit所显示的表情
      value: 'chore',
    },
    perf: {
      description: 'A code change that improves performance',
      emoji: '⚡️',
      value: 'perf',
    },
    refactor: {
      description: 'A code change that neither fixes a bug or adds a feature',
      emoji: '♻️',
      value: 'refactor',
    },
    docs: {
      description: 'Documentation only changes',
      emoji: '📚',
      value: 'docs',
    },
    test: {
      description: 'Adding missing tests',
      emoji: '✅',
      value: 'test',
    },
    revert: {
      description: 'Reverts a previous commit',
      value: 'revert',
      emoji: '⏪️',
    },
    build: {
      description: 'Changes that affect the build system or external dependencies',
      emoji: '📦️',
      value: 'build',
    },
    ci: {
      description: 'CI related changes',
      emoji: '🎡',
      value: 'ci',
    },
    release: {
      description: 'Create a release commit',
      emoji: '🏹',
      value: 'release',
    },
  },
  messages: {
    type: "Select the type of change that you're committing:\n",
    customScope: 'Denote the SCOPE of this change (optional):\n',
    subject: 'Write a SHORT, IMPERATIVE tense description of the change:\n',
    body: 'Provide a LONGER description of the change:\n ',
    breaking: 'List any BREAKING changes:\n',
    footer: 'Issues this commit closes, e.g #123, #124:\n',
    confirmCommit: 'Are you sure you want to proceed with the commit above:\n',
  },
};
  1. 指定git-cz作为commitizen适配器

在package.json中指定commitizen适配器的安装位置

json 复制代码
"config": {
    "commitizen": {
      "path": "./node_modules/git-cz"
    }
  }

校验commit message

  1. 安装commitlint
shell 复制代码
npm i @commitlint/{cli,config-conventional} --save-dev --save-exact
  1. 添加commitlint.config.js
js 复制代码
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    // type-enum与changelog.config.js文件中保持一致
    'type-enum': [
      2,
      'always',
      [
        'feat',
        'fix',
        'style',
        'chore',
        'perf',
        'refactor',
        'docs',
        'test',
        'revert',
        'build',
        'ci',
        'release',
      ],
    ],
  },
};

注册Git钩子

  1. 安装husky
shell 复制代码
npm i husky --save-dev --save-exact
# 添加npm钩子
npm pkg set scripts.prepare="husky"
  1. 添加.husky/prepare-commit-msg
shell 复制代码
#!/usr/bin/env sh
exec < /dev/tty && npx --no-install git-cz --hook
  1. 添加.husky/commit-msg
shell 复制代码
#!/usr/bin/env sh
npx --no-install commitlint -e

问题

  1. 添加prepare-commit-msg钩子后,git commit --amendgit rebase -i HEAD~n等命令也会执行.husky/prepare-commit-msg中的命令,影响Git使用。

解决方案: 通过判断shell命令的参数数量,判断使用git-cz与否。修改.husky/prepare-commit-msg如下。

shell 复制代码
if [ $# -eq 1 ]; then
	# 参数数量等于1时(git commit),使用git-cz
  echo 'Use git-cz'
  exec < /dev/tty && npx --no-install git-cz --hook
else
	# 参数数量大于1时,不使用git-cz
  echo 'Skip git-cz'
fi
  1. 不知道git-cz如何自定义scope。有佬知道的话,麻烦教教我哈~(拜谢🙏)
相关推荐
Martin -Tang10 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发11 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端