??在 (一) 初探 iOS 單元測試 一文中悠轩,我們簡單提到了執(zhí)行xcodebuild test可以啟動工程的單元測試并輸出測試結(jié)果试浙,但手動執(zhí)行此類命令意義是不大的族吻。我們需要的是暴心,把一些測試和lint等命令寫在腳本文件里辽旋,在代碼提交浩嫌、合并及打包等行為實(shí)際發(fā)生前,自動執(zhí)行腳本补胚,以執(zhí)行的結(jié)果決定是否打斷上述操作码耐,一定程度上達(dá)到控制代碼質(zhì)量的目的。
??在多人協(xié)作開發(fā)中溶其,我們可以在所有成員進(jìn)行某些git操作(commit push merge rebase等)前進(jìn)行代碼的驗證(Test骚腥、Lint等),防止邏輯錯誤或不合規(guī)范的代碼更新到遠(yuǎn)端倉庫中瓶逃。當(dāng)然束铭,如果團(tuán)隊搭建了自己的git服務(wù)器,有Mac服務(wù)器厢绝,在server端進(jìn)行g(shù)it hooks是最好的解決方案契沫,本地倉庫也不用進(jìn)行額外配置。此外昔汉,我們也可以做一些Client Hooks懈万,來達(dá)到同樣的效果。以下內(nèi)容是筆者對git pre-push hook的一些實(shí)踐挤庇。
手動添加pre-push文件
前往本地倉庫钞速,按下command+shift+.查看隱藏文件,目錄如下嫡秕。我們可以看到.git/hooks路徑下有一些.sample的文件渴语。
刪除pre-push.sample文件的后綴名,用編輯器打開昆咽,寫入:
exit 1
保存退出驾凶,倉庫根目錄下牙甫,執(zhí)行:
git push
可以看到push失敗。下面我們在pre-push寫入單元測試的命令调违,如果測試通過窟哺,pre-push程序正常退出,push成功技肩;測試失敗且轨,出錯并退出,push失敗虚婿。寫入:
workspace_name() {
workspace_file=`find . -maxdepth 2 -name *.xcworkspace -exec basename {} \;`
echo ${workspace_file%.xcworkspace}
}
check_result() {
if [ $? != 0 ]; then
echo "$1 failed!!"
echo "push will not execute"
echo "$?"
exit 1
else
echo "$1 passed."
echo "push will execute"
echo "$?"
fi
}
workspace=$(workspace_name)
xcodebuild -workspace Example/$workspace.xcworkspace -scheme $workspace-Example -destination 'platform=iOS Simulator,OS=11.0,name=iPhone 7' test
check_result "test"
例子是以pod lib create ...
創(chuàng)建的標(biāo)準(zhǔn)工作空間旋奢,從倉庫根目錄起以最大深度為2尋找以.xcworkspace結(jié)尾的文件名,賦給workspace變量然痊,最后test名為worksapce.xcworkspace scheme為worksapce-Example的工程至朗,測試失敗,打印"push will not execute"
剧浸,exit 1
锹引;反之打印push will execute
,exit 0
唆香。 倉庫根目錄下執(zhí)行:
git push
最后輸出:
現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了一些我們想要的效果袋马,但如何讓團(tuán)隊里的每個開發(fā)成員都收到pre-push hook的規(guī)范呢初澎?
自動添加pre-push文件
我們知道,.git文件夾并不會被push到遠(yuǎn)程倉庫虑凛,每個成員clone倉庫碑宴,.git文件夾是會初始化的。也就是說桑谍,正常情況下延柠,pre-push hook只對個人有效。但我們可以耍一些小手段锣披,讓每個成員倉庫.git/hooks路徑下都存在我們寫好的pre-push文件贞间,這樣其他成員的倉庫也具備了git pre-push hook功能。
if [ ! -d "$../.git/hooks/pre-push" ]; then
cp ../pre-push ../.git/hooks/pre-push
exit 0
fi
首先雹仿,我們寫好一個腳本增热,功能為如果.git/hooks路徑下沒有pre-push文件,就復(fù)制一個進(jìn)去胧辽。如圖中add-pre-push-hook.sh文件:
那這個腳本在什么時候被執(zhí)行呢峻仇?答案是放在我們Target的Run Script下:
??注意Run Script 和 add-pre-push-hook.sh 是在.xcodeproj的路徑下開始執(zhí)行的。這樣邑商,每當(dāng)build摄咆,就會執(zhí)行add-pre-push-hook.sh檢查.git/hooks文件夾下是否存在pre-push文件并嘗試復(fù)制進(jìn)去凡蚜。下次當(dāng)開發(fā)成員嘗試push代碼時,便無形中受到了hook?源印3!這一切對很多工程的基礎(chǔ)庫的維護(hù)做代碼檢查還是有一定實(shí)用價值的涩金。
謝謝觀看谱醇!歡迎指出文中錯誤!
參考文檔
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/
http://blog.ricardofilipe.com/post/git-hook-push-master