前端 Git-Hooks 工程化實踐

来源:https://www.cnblogs.com/dtux/archive/2022/06/28/16419271.html
-Advertisement-
Play Games

前言 前段時間,部門的前端項目遷移到 monorepo 架構,筆者在其中負責跟 git 工作流相關的事情,其中就包括 git hooks 相關的工程化的實踐。用到了一些常用的相關工具如 husky、lint-staged、commitizen、commit-lint 等,以此文記錄一下整個的實踐過程 ...


前言

前段時間,部門的前端項目遷移到 monorepo 架構,筆者在其中負責跟 git 工作流相關的事情,其中就包括 git hooks 相關的工程化的實踐。用到了一些常用的相關工具如 husky、lint-staged、commitizen、commit-lint 等,以此文記錄一下整個的實踐過程和踩過的坑。

註意:下文中的例子以及命令都是基於 Mac OS,如果你是 windows 用戶,也不用擔心,文中也會闡述大致原理和運行邏輯,對應的 windows 命令可以推理得知。

Git Hooks

Git Hooks 是什麼

大多數同學應該都對 git hooks 相當瞭解,但是筆者還是想在這裡詳細解釋一下。
首先是 hook,這其實是電腦領域中一個很常見的概念,hook 翻譯過來的意思是鉤子或者勾住,而在電腦領域中則要分為兩種解釋:

  1. 攔截消息,在消息到達目標前,提前對消息進行處理
  2. 對特定的事件進行監聽,當某個事件或動作被觸發時也會同時觸發對應的 hook
    也就是說 hook 本身也是一段程式,只是它會在特定的時機被觸發。

理解了 hook 這一概念,那麼 git hooks 也就不難理解了。git hooks 就是在運行某些 git 命令時,被觸發的對應的程式。

在前端領域,鉤子的概念也並不少見,比如 Vue 聲明周期鉤子、React Hooks、webpack 鉤子等,說到底它們都是在特定的時機觸發的方法或者函數

常見的 Git Hooks 有哪些

git hooks 分為兩類

客戶端 hook

  • pre-commit hook, 在運行 git commit 命令時且在 commit 完成前被觸發
  • commit-msg hook, 在編輯完 commit-msg 時被觸發,並且接受一個參數,這個參數是存放當前 commit-msg 的臨時文件的路徑
  • pre-push hook, 在運行 git push 命令時且在 push 命令完成前被觸發

服務端 hook

  • pre-receive 在服務端接受到推送時且在推送過程完成前被觸發
  • post-receive 在服務端接收到推送且推送完成後被觸發

這裡只列舉了一部分,更多的 git hooks 詳細信息見官方文檔

在本地 git 倉庫中的 .git/hooks 文件夾中也可以看到常用的 git hooks 示例

file

從圖中可以看到,預設的 git hooks 都是 shell 腳本,只需要將 git hooks 的示例文件的 .sample 擴展名去掉,那麼示例文件即可生效。
一般來說,在前端工程中應用 git hooks 都是運行 javaScript 腳本,就像這樣

#!/bin/sh
node your/path/to/script/xxx.js

或者是這樣

#!/usr/bin/env node
// javascript code ...

原生的 Git Hooks 的缺陷

原生的 git hooks 有一個比較大的問題是 .git 文件夾下的內容不會被 Git 追蹤。這就表示,無法保證讓一個倉庫中所有的成員都使用同樣的 git hooks,除非倉庫的所有成員都手動同步同一份 git hooks,但這顯然不是個好辦法。

Husky

Husky 的使用

  1. 安裝 husky
pnpm install husky --save-dev
  1. husky 初始化
npx husky install
  1. 設置 package.json 的 prepare。來保證 husky 可以正常運行
npm set-script prepare "husky install"
  1. 添加 git hooks
npx husky add .husky/${hook_name} ${command}

husky install 命令做了什麼

事實上,husky install 命令是解決 git hooks 問題的關鍵

  • 第一步: husky install 會在項目根目錄下創建 .husky 以及 .husky/_ 文件夾(文件夾也可以自定義),然後在 .husky/_ 文件夾下創建 husky.sh 腳本文件。 這個文件的作用就是保證通過 husky 創建的腳本能夠正常運行,它的實際應用的地方後面會講到。更多關於這個腳本的討論可以看這裡 github issue
  • 第二步: husky install 會運行 git config core.hooksPath ${path/to/hooks_dir},這個命令用來指定 git hooks 的路徑,此時觀察項目下 .git/config 文件, [core] 下麵會多出一條配置: hooksPath = xxx。當 git hooks 被某些命令觸發時,Git 會運行 core.hooksPath 指定的文件夾下的 git hook。

更多關於 husky 的配置、命令相關文檔,看這這裡

值得註意的是 core.hooksPath 是 Git v2.9 推出的新特性,而 Husky 也是在 v6 版本開始使用 core.hooksPath 這個特性。在這之前的版本,Husky 會直接覆蓋 .git/hooks 文件夾下所有的 hook,來使通過 Husky 配置的 hooks 生效。另外,在配置了 core.hooksPath 後 Git 會忽略 .git/hooks 文件夾下的 git hooks

husky add 命令做了什麼

當運行如下命令

npx husky add .husky/pre-commit npx eslint

.husky 目錄下會新增一個 pre-commit 文件,文件內容為

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx eslint

此時已經成功添加了一個 pre-commit git hook,這個腳本會在運行 git commit 命令時執行。
在腳本的第二行,引用了上面所說的 .husky.sh 文件,也就是說通過 husky 創建的 git hook 在被觸發時,都會執行這個腳本。

梳理一下,husky 是如何解決原生的 git hooks 的問題的,首先前面已經提到了原生 git hooks 主要的問題是 git 無法跟蹤 .git/hooks 下的文件,但是這個問題已經被 git core.hooksPath 解決了,那麼新的問題就是,開發者仍然需要手動設置 git core.hooksPath。 husky 在 install 命令中幫助我們設置了 git core.hooksPath,然後在 package.json 的 scripts 中添加 "prepare": "husky install",這樣每次安裝依賴的時候就會執行 husky install,因此就可以保證設置的 git hooks 可以被觸發了。

常用的 git 相關工具庫

lint-staged

在 pre-commit hook 中,一般來說都是對當前要 commit 的文件進行校驗、格式化等,因此在腳本中我們需要知道當前在 Git 暫存區的文件有哪些,而 Git 本身也沒有向 pre-commit 腳本傳遞相關參數,lint-staged 這個包為我們解決了這個問題,lint-staged 的文檔中第一句這樣說道:

Run linters against staged git files and don't let

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 體驗簡介 場景將提供一臺配置了CentOS 8.5操作系統的ECS實例(雲伺服器)。通過本教程的操作帶您體驗如何將PolarDB-X通過Canal與ClickHouse進行互通,搭建一個實時分析系統。點擊前往 實驗準備 1. 創建實驗資源 開始實驗之前,您需要先創建ECS實例資源。 在實驗室頁面,單 ...
  • 你在鍛煉健身時,有沒有遇到這樣的情況?辛辛苦苦鍛煉了幾小時,卻發現App停止了運行,本次運動並沒有被記錄到App上,從而失去了一個查看完整運動數據的機會? 運動類App是通過手機或者穿戴設備的感測器,來識別運動狀態並反饋給用戶的,App能否在手機後臺時刻保持運行是影響運動數據完整性的關鍵因素。為了滿 ...
  • 視頻鏈接: JavaScript var let const的區別 - Web前端工程師面試題講解 參考鏈接: JavaScript 變數 JavaScript Let JavaScript Const 練習網站: codepen.io 初步認識: 功能實現 HTML的部分: <input type ...
  • 1、CSS畫一個三角形:(div寬高為0,border存在且顏色不一) step1: 設置寬度,高度為 0 的一個div盒子; step2: 為了方便理解,將盒子的 4 個邊框分別設置一樣的寬度boder,不同的顏色; step3: transparent將其他三個 邊框隱藏掉,就能看到效果了。 如 ...
  • Vue 框架通過數據雙向綁定和虛擬 DOM 技術,幫我們處理了前端開發中最臟最累的 DOM 操作部分, 我們不再需要去考慮如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 項目中仍然存在項目首屏優化、Webpack 編譯配置優化等問題,所以我們仍然需要去關註 Vue 項目性能方面的優化,使 ...
  • 一種JavaScript響應式系統實現 根據VueJs核心團隊成員霍春陽《Vue.js設計與實現》第四章前三節整理而成 1. 響應式數據與副作用函數 1.1 副作用函數 會產生副作用的函數。 如下示例所示: function effect () { document.body.innerText = ...
  • pageClass: home-page-class 鯉魚跳龍門動畫 1. 需求 年中618營銷活動要求做一個鯉魚跳龍門的動畫,產品參考了支付寶上的一個動畫,要求模仿這個來做一個類似的動畫。產品提供的截屏視頻如下: 圖1 從這個視頻里得到的信息,我們可以把動畫分解一下: 321倒計時結束,動畫開始播 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 寫在前面 雖然說Fetch API已經使用率已經非常的高了,但是在一些老的瀏覽器還是不支持的,而且axios仍然每周都保持2000多萬的下載量,這就說明瞭axios仍然存在不可撼動的地位,接下來我們就一步一步的去封裝,實現一個靈活、可復用 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...