用 pre-commit 輕鬆提升程式碼品質

Last updated on  Jul 20, 2024  in  開發工具  by  Amo Chen  ‐ 2 min read

pre-commit 是一套相當方便的 Git pre-commit hooks 工具,除了內建不少好用的程式碼檢查工具之外,也同時支援 Python, Ruby, Swift, Go, Nodejs 等熱門程式語言,更能夠利用其框架(framework)針對自己的需求開發 pre-commit hooks 。

這麼好用的工具怎能不裝來使用呢!

一起利用 pre-commit 改善我們的程式碼品質吧!

本文環境

  • Python 3.8.1
  • pre-commit 2.21.0

安裝(Installation)

pre-commit 是利用 Python 所開發的工具,因此安裝 pre-commit 只需要透過 Python 套件管理工具 pip 即可:

$ pip install pre-commit

設定 .pre-commit-config.yaml

pre-commit 是在執行 git commit 指令時會跟著運作的指令,所以必須在 git 專案中添加 .pre-commit-config.yaml 設定檔,讓 pre-commit 知道要執行哪些 hooks 。

所以 .pre-commit-config.yaml 設定檔會跟 .git/ 同一層,例如:

.
├── README.md
├── requirements.txt
├── .git
├── .pre-commit-config.yaml
└── project/

.pre-commit-config.yaml 設定檔的內容可以使用以下指令產生:

$ pre-commit sample-config > .pre-commit-config.yaml

成功執行的話,可以打開 .pre-commit-config.yaml 檔案看看:

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

接著說明上述設定檔的內容。

由於 pre-commit 將各種 hooks 存放在另外的 GitHub repository pre-commit-hooks ,因此能夠看到 .pre-commit-config.yaml 中設定為 repo: https://github.com/pre-commit/pre-commit-hooks

而我們所指定的 repo 版本為 v3.2.0 ,對應的即是 https://github.com/pre-commit/pre-commit-hooks/releases 中的版本號,原則上只要用最新的版本號即可。

最後是透過 hooks 設定要啟用的功能,唯一必填的設定為 id ,這些 id 可以在此文件中找到相對應的 id 與說明,大家可以閱讀各個功能的說明,並且挑選合用的 hooks 。

簡單說明一下,上述設定檔中的 4 個 hooks 的作用:

  • trailing-whitespace 去除每行結尾的空白
  • end-of-file-fixer 確保每個檔案最後 1 行是空行
  • check-yaml 檢查 repo 中的 yaml 檔格式是否正確
  • check-added-large-files 防止大檔案被 commit 進 repo

如果是 Python 的開發者,可以使用以下設定(啟用 flake8 的檢查):

-   repo: https://github.com/PyCQA/flake8
    rev: 6.0.0
    hooks:
    -   id: flake8

p.s. 請記得安裝 flake8

關於 hooks 更詳細的設定可以參閱 .pre-commit-config.yaml - hooks

安裝 pre-commit hooks

完成 .pre-commit-config.yaml 設定檔之後,需要用以下指令安裝 pre-commit hooks 到 Git ,如此才能讓 pre-commit hooks 發揮作用:

$ pre-commit install --install-hooks

試著隨便改幾個檔案,並執行 git commit -m 'test pre-commit' 看看是否會出現類似以下的訊息:

$ git cim 'test pre-commit'
Trim Trailing Whitespace.................................................Passed
Flake8...................................................................Passed
[master 1234567] test pre-commit
 2 files changed, 2 insertions(+), 1 deletion(-)

如果有出現類似以上的訊息就是成功囉!

幫忙偵測金鑰、密碼被 commit 的 pre-commit hooks

開發時,還有一種常見的錯誤——「將金鑰、密碼 commit」,這會導致金鑰與密碼有洩漏的風險!

最好的方法是使用 Gitleaks 或者類似工具,安裝到 pre-commit 之中。

其設定寫法為:

repos:
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.16.1
    hooks:
      - id: gitleaks

如此一來,就可以在 commit 金鑰、密碼之前事先阻擋避免錯誤發生!

總結

pre-commit 是一個相當實用的套件,可以有效增進 codebase 的品質,實際上,個人是將 pre-commit 整合在 GitHub Actions, 如果有隊友開了新的分支或 push commit, GitHub Actions 就會自動執行 pre-commit 進行檢查,如果檢查不通過就無法進主線。

大家也可以透過類似方式打造適合自己或團隊的 pre-commit 流程,達到保護他人也保護主線的目的。

以上是關於 pre-commit 的介紹!

Happy Coding!

References

https://pre-commit.com/

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!