在 iOS 開發中使用 pre-commit hook

許多人寫了單元測試而且運行持續集成服務器來檢查 pull requests,咱們還能夠利用像 Danger 這樣強大的工具。html

若是想要在最先期阻止一些常見的錯誤,咱們可使用 pre-commit hookios

注:原做者的朋友 Sami Samhuri 改善了他的腳本,本文也隨着更新了。另外譯文調整了一下結構,增長了對 pre-commit 的簡要說明。最新的腳本在這裏git

pre-commit hook

有時候一些測試代碼或者測試工具不該該提交到遠程倉庫,因此提交代碼前的審查就頗有必要。Git 支持不少 hooks,hooks 是一些在 $GIT-DIR/hooks 目錄中的腳本,由特定的事件觸發執行。pre-commit hook 就是在提交以前觸發,能夠用來檢查待提交代碼是否有錯誤。這裏能夠查看到有關 git hooks 更詳細的說明github

咱們想要阻止的

放錯位置的視圖 (Misplaced Views)

你有提交過一些位置不對的視圖,打算之後修復嗎?shell

有時候 Xcode 過於熱切,而且有多個顯示器(視網膜vs非視網膜問題...),就很容易忽然把東西放錯位置。bootstrap

我就作過。swift

用一個簡單的 grep 掃描 interface builder 文件內容能夠發現這些錯位的視圖:bash

  • 模式:misplaced="YES"服務器

  • 文件:Specs.swift .storyboard微信

集中測試 (Focused tests)

Kiwi 或者 Quick 這樣的代碼庫可讓咱們作集中測試,這能夠加快開發速度,頗有用。

可是它們絕對不該該被提交,不然可能無心中改變一些東西,形成其餘全部測試都被禁用,還會隱藏一些嚴重的問題。

咱們須要在測試文件中找出 fdescribe / fit / fcontext 和其餘相似的東西:

  • 模式: (fdescribe|fit|fcontext|xdescribe|xit|xcontext)

  • 文件: *Specs.swift

合併起來

咱們只須要確認已暫存(staged)的改變中是否包含上面的東西就行了,不要檢查全部文件,由於這在開發的時候會很煩人。

幸運的是,咱們能夠把 git diff-index -p -M --cached HEADgrep '^+' 一塊兒使用。

最終的 pre-commit.sh 文件:

#!/usr/bin/env bash
set -eu

failed=0

test_pattern='\b(fdescribe|fit|fcontext|xdescribe|xit|xcontext)\b'
if git diff-index -p -M --cached HEAD -- '*Tests.swift' '*Specs.swift' | grep '^+' | egrep "$test_pattern" >/dev/null 2>&1
then
  echo "COMMIT REJECTED for fdescribe/fit/fcontext/xdescribe/xit/xcontext." >&2
  echo "Remove focused and disabled tests before committing." >&2
  echo '----' >&2
  git grep -E "$test_pattern" '*Tests.swift' '*Specs.swift'  >&2
  echo '----' >&2
  failed=1
fi

misplaced_pattern='misplaced="YES"'

if git diff-index -p -M --cached HEAD -- '*.xib' '*.storyboard' | grep '^+' | egrep "$misplaced_pattern" >/dev/null 2>&1
then
  echo "COMMIT REJECTED for misplaced views. Correct them before committing." >&2
  echo '----' >&2
  git grep -E "$misplaced_pattern" '*.xib' '*.storyboard' >&2
  echo '----' >&2
  failed=1
fi

exit $failed

你也能夠在這裏獲取最新的腳本。這個腳本在命令行和 macOS git 客戶端均可以使用。

讓 hook 在團隊中保持同步

大多數的應用都是由團隊製做的,咱們就想到要在每一個 git 倉庫中安裝鉤子 (git hook)。但這並非使用 git 的工做方式,那咱們該怎麼作呢?答案:使用符號連接(symlinks)

我負責過的大多數項目都有相似於 bootstrap script 的東西,用來加載 Carthage 或者作其餘一些準備工做。

下面這個簡單的啓動腳本 (bootstrap script) 可讓你在你的倉庫裏安裝鉤子 (git hook),使得整個團隊保持同步變得簡單。

#!/usr/bin/env bash
# Usage: scripts/bootstrap

set -eu

ln -s ../../scripts/pre-commit.sh .git/hooks/pre-commit
  1. 若是有錯誤,它將退出shell,若是未設置任何變量,則將錯誤消息寫入標準錯誤。

  2. 建立 git 內部預提交鉤子文件(internal git pre-commit hook file)與咱們的倉庫中腳本之間的符號連接。

這個腳本假設 pre-commit.shbootstrap 文件都在你的倉庫的 Scripts 文件夾下面。

總結

預提交鉤子給咱們提供了很簡單的方式去阻止一些常見的錯誤,

  • 一行代碼就能夠爲團隊中全部人配置

  • 在整個團隊中同步

  • git 跟蹤變化,PR 中可見

  • 用腳本實現,若是你願意,你能夠把它做爲 build phase 執行(儘管我沒有)


相關閱讀
在 React Web 和 原生 App 中共享代碼
React Native 一週年回顧
快速部署Test-Driven Development/Debug環境

做者往期佳做
iOS – 更輕量級的 AppDelegate – 面向服務設計
使用 FlowControllers 改進iOS應用架構
Objective-C Runtime 之動態方法解析實踐

做者信息
原文做者:Krzysztof Zabłocki
原文連接:http://merowing.info/2016/08/...翻譯系力譜宿雲 LeapCloud 團隊_UX研發成員:Alex Sun譯者簡介:iOS開發微信公衆號:MaxLeap_yidongyanfa

相關文章
相關標籤/搜索