背景
最近聊到代碼格式化的問題,大家一致認為手工代碼review的時候去發現這些問題是低效率,而且也不能保證百分百發現問題的,于是想重新啟用自動化檢測,說到這個檢測大家應該都接觸過,舉例我們之前用的swiftlint工具,工具的官方文檔是這么說的:下載安裝好之后,在我們項目的build phase中加入一個腳本,然后就可以在每次編譯的時候自動檢測代碼格式,并且還能提供相應的xcode里的報錯提示。那么這么做會帶來一個問題,就是在大的項目中,每次都去swiftlint整個工程的文件,顯然會加長編譯時間,而浪費時間就等于謀財害命。所以我們今天來看看如何在git commit的時候再去格式化代碼。
基礎
git hook
所謂git hook簡單來說就是在執行git命令的時候,用一些自定義的腳本執行一些其他的操作,例如,檢查一下這次提交有沒有寫提交信息。
使用
這個是通過在.git/目錄下的hooks文件中添加一些自定義的腳本來實現的,而系統為我們默認帶了一些簡單的例子
從這個圖中可以看到有很多類型的hook文件,怎么使用呢?
最簡單的方式就是把文件名后邊的.sample去掉就可以了。
hook分類
從上文介紹中我們可以看到hooks文件夾下默認是有很多hook的樣例文件的,這些文件的功能都體現在了名字上
例如 prepare-commit-msg.sample 這個文件的功能就是在commit的時候檢查輸入的commit信息是不是符合規范的,而 pre-commit.sample 這個文件的的作用是我們在提交的時候對所提交的內容或者環境做一個額外的操作,比如檢查下所使用的庫的版本之類的。其余的大家可以自行了解。
自定義hook的位置
當然我們的hook并不是僅僅只能放在這里。實際上,我們可以通過git config來配置我們的hook位置。
當我們執行git config --list的時候就會把我們目前git的一個配置打印出來,我們可以在其中加一行
core.hooksPath="/path/to/hookfolder"
例如,假設我們和./git目錄平級的有一個.githooks的文件夾,結構如下:
那么我們就需要在配置中增加如下一行
core.hooksPath=./githooks
格式化工具
因為現在大部分的工程都是swift+OC的混合編譯,那么格式化的工具就會有兩個swiftlint和oclint。具體怎么用,這個對應的官網都有,就不細說了。但是介紹都是在編譯的時候運行這些工具來進行檢測,今天我們介紹的是在commit的時候進行檢測,所以大家可以先安裝好對應的格式化工具,或者等到后邊我們使用工具的時候自動會安裝這兩個工具.
hook管理工具
這個我建議大家使用pre-commit這個工具來管理hook,打個比方,我們工程在執行commit的時候需要運行10個檢測工具,那么我們需要安裝10個庫,然后寫10個命令到pre-commit腳本中。這就很考驗我們的水平了,但是有了這個工具,我們只需要寫一個配置文件,它就會自動管理好這10個庫。
官網在https://pre-commit.com/
安裝教程也很簡單,都有介紹,我就不說了。但是事情總不會像教程介紹的那么順利,于是,我就遇到了各種問題,接下來就介紹一下。
安裝問題及處理辦法
- 首先我們在pre-commit-config.yaml中定義了對應的hook之后,當我們執行安裝hook的命令的時候,很有可能就會出現等了很久(大概7000多秒的樣子)然后報錯了,告訴我們有些庫拉不下來。那么這個問題就是被墻了,同學們如果會科學上網的話,應該是沒有問題,那么如果你發現你能訪問github,但是還是報錯,這個問題怎么辦呢
1.1 首先拿著github的域名找到對應的ip地址,例如我們在網站上查到了對應的地址
地址查找
1.2 然后修改我們/etc/hosts的文件,在里面增加對應的ip和域名項例如:
xxx.xxx.xxx.xxx github.com
但是不出意外你沒有權限修改這個文件,大家可以新建一個hosts的文件,將原來的內容粘貼進去,然后進行修改,之后將文件粘貼回/etc/下并選擇替換
1.3 退出并保存,然后重新執行安裝。 - 如果你連github都訪問不了呢,那么可以用下載好的格式化工具包(組里至少有能訪問的同學吧),然后通過本地hook的方式安裝:
2.1 首先把對應的hook文件都解壓,然后放到pre-commit-config.yaml的同級目錄下,或者子目錄
2.2 在pre-commit-config.yaml文件中 repo 寫為對應的工具包的位置
2.3 執行安裝命令,也是可以的。
那么如果還是報錯找不到庫呢,別急,在控制臺輸出的錯誤信息中有一個找不到文件的查找目錄,比如.cache/tmp/xxxxx這個時候可以手動將對應的文件導入,例如,將package.swift放到目錄下就可以
結語
盡管有了格式化工具,但是還是希望大家多多在平時就注意代碼格式,不然你可能都不好意思讓別人看你寫的代碼。