记录一下在项目中集成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。有佬知道的话,麻烦教教我哈~(拜谢🙏)
相关推荐
崔庆才丨静觅10 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅10 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅10 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅11 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊11 小时前
jwt介绍
前端
爱敲代码的小鱼11 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Cobyte11 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
NEXT0611 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
剪刀石头布啊12 小时前
生成随机数,Math.random的使用
前端