前端工程化--commit代碼校驗配置

需求

配置使得在git commit -m 'xxxx’時,先執行1. eslint檢測 2.commit規範檢測,兩個條件通過後才commit成功,纔可以push代碼。是前端工程化的一部分,使得代碼及commit更加規範

commitlint

commitlint: 可以幫助我們 lint commit messages, 如果提交的不符合指向的規範, 拒絕提交
需要一份校驗的配置, 這裏推薦 @commitlint/config-conventional (符合 Angular團隊規範).
安裝:

npm install  @commitlint/config-conventional @commitlint/cli --save

同時需要在項目目錄下創建配置文件 .commitlintrc.js, 寫入:

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

rules可以自己設置團隊規範,我沒設,用的angular團隊規範

husky

commitlint配置完成後還要配置husky。husky是git的hook(鉤子)工具

【git鉤子】
就像vue的生命週期鉤子函數,Git 能在特定的重要動作發生時觸發自定義腳本。有兩組這樣的鉤子:客戶端的和服務器端的。 客戶端鉤子由諸如提交合併這樣的操作所調用,而服務器端鉤子作用於諸如接收被推送的提交這樣的聯網操作。
【提交鉤子有】:(後面會有詳細解釋)
pre-commit
prepare-commit-msg
commit-msg
post-commit

前端則可以用插件husky來使鉤子生效。
安裝

npm install husky --save

配置
在package.json中配置

  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS"
    }
  }

這段配置的意思是:在’commit-msg’這個鉤子內獲取commit裏的內容進行commitlint檢測,如果果該鉤子腳本以非零值退出,Git 將放棄提交
此時我如果提交不符合規範的commit,結果如下

$ git commit -m "測試 commitlint"
husky > commit-msg (node v10.13.0)

⧗   input: 
測試 commitlint

✖   message may not be empty [subject-empty]
✖   type may not be empty [type-empty]
✖   found 2 problems, 0 warningshusky > commit-msg hook failed (add --no-verify to bypass)

可以看到如果不按照規範書寫commit的日誌會提示報錯

下面輸入正確的commit 日誌信息:注意冒號後面要留空格,下面有介紹具體的編輯規範信息

$ git commit -m "feat(): 添加commitlint"
husky > commit-msg (node v10.13.0)

⧗   input: feat(): 添加commitlint
✔   found 0 problems, 0 warnings[master 7a5bc00] feat(): 添加commitlint
 4097 files changed, 219349 insertions(+)
 create mode 100644 commitlint.config.js
 create mode 120000 node_modules/.bin/JSONStream
 create mode 120000 node_modules/.bin/commitlint
 create mode 120000 node_modules/.bin/conventional-commits-parser

下面就可以push了

新需求

按理來說這樣已經成功了,但希望commitlint檢測失敗後有提示後再退出。比如如下效果
在這裏插入圖片描述
那就需要對husky的配置進行修改,修改涉及到shell腳本知識

  "husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS || (node scripts/pre-commit.js&&exit 8)"
    }
  }

對於shell1||shell2,只有在shell1執行失敗時,shell2纔會執行,否則shell2是不執行的
所以以上配置的意思是commitlint -e $GIT_PARAMS失敗時,執行
(node scripts/pre-commit.js&&exit 8)
即執行package.json所在文件夾下的scripts/pre-commit.js文件後退出
詳細shell見shell中&&和||的使用方法
項目目錄如下
在這裏插入圖片描述
pre-commit.js文件內容如下,要npm install chalk --save,引入chalk模塊,作用是爲了讓console出來的有顏色。。。

const chalk = require('chalk');
console.log(
  chalk.red(`commit格式錯誤,正確示例:git commit -m 'fix: 修復bug'`),
  chalk.green(` 
  type (只允許下列7個標識):
  feat:新功能(feature)
  fix:修補bug
  docs:文檔(documentation)
  style: 格式(不影響代碼運行的變動)
  refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
  test:增加測試
  chore:構建過程或輔助工具的變動
  `)
)

這樣就配置完成了,可以達到效果了

加上eslint

完成後,又希望提交的代碼都符合eslint規範,如果不符合規範不能提交,所以在pre-commit鉤子里加上eslint檢查,配置如下,執行npm run lint

  "husky": {
    "hooks": {
      "pre-commit": "npm run lint",
      "commit-msg": "commitlint -e $GIT_PARAMS || (node scripts/pre-commit.js && exit 8)"
    }
  }

這樣就配置完了
eslint檢測不通過提交不了,要想解決eslint錯誤可以看解決eslint報錯

git鉤子詳解

剛纔用到了pre-commit, commit-msg,解釋如下,有點像vue的生命週期鉤子函數,在提交前依次執行,我這裏把eslint檢查放在pre-commit裏,commitlint檢查放commit-msg裏
具體:自定義 Git - Git 鉤子
pre-commit 鉤子在鍵入提交信息前運行。 它用於檢查即將提交的快照,例如,檢查是否有所遺漏,確保測試運行,以及覈查代碼。 如果該鉤子以非零值退出,Git 將放棄此次提交,不過你可以用 git commit --no-verify 來繞過這個環節。 你可以利用該鉤子,來檢查代碼風格是否一致(運行類似 lint 的程序)、尾隨空白字符是否存在(自帶的鉤子就是這麼做的),或新方法的文檔是否適當。

prepare-commit-msg 鉤子在啓動提交信息編輯器之前,默認信息被創建之後運行。 它允許你編輯提交者所看到的默認信息。 該鉤子接收一些選項:存有當前提交信息的文件的路徑、提交類型和修補提交的提交的 SHA-1 校驗。 它對一般的提交來說並沒有什麼用;然而對那些會自動產生默認信息的提交,如提交信息模板、合併提交、壓縮提交和修訂提交等非常實用。 你可以結合提交模板來使用它,動態地插入信息。

commit-msg 鉤子接收一個參數,此參數即上文提到的,存有當前提交信息的臨時文件的路徑。 如果該鉤子腳本以非零值退出,Git 將放棄提交,因此,可以用來在提交通過前驗證項目狀態或提交信息。 在本章的最後一節,我們將展示如何使用該鉤子來覈對提交信息是否遵循指定的模板。

post-commit 鉤子在整個提交過程完成後運行。 它不接收任何參數,但你可以很容易地通過運行 git log -1 HEAD 來獲得最後一次的提交信息。 該鉤子一般用於通知之類的事情。

commit message規範

那麼什麼樣的是符合規範的commit message?
一般就是
type(scope): subject
例子:
fix: 修復bug

type:種類,必寫
scope:影響範圍 可以不寫
subject:簡短說明,50字符內
其實還有body,foot什麼的,我覺得寫個subject簡短說明就夠了,難不成還在commit裏寫作文
注意:冒號後面一定要加空格,否則不能通過commitlint驗證

type有以下幾種:

  • feat:新功能(feature)
  • fix:修補bug
  • docs:文檔(documentation)
  • style: 格式(不影響代碼運行的變動)
  • refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
  • test:增加測試
  • chore:構建過程或輔助工具的變動
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章