SwiftLine安裝使用---包含Git Hooks

SwiftLine的使用分為 編譯期間代碼提交期間

1. SwiftLine的安裝使用 - 編譯期間的使用

參考文章:https://blog.csdn.net/blog_t/article/details/89025230?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1

全局安裝

全局安裝非常簡(jiǎn)單,首先我們需要通過(guò)brew命令安裝SwiftLint:

brew install swiftlint

然后添加編譯腳本:


image.png

最后在黑框框中添加如下腳本:

if which swiftlint >/dev/null; then
swiftlint
#echo "skip"
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

大功告成簿晓,就可以編譯啦桩砰,之后每次安裝只需要給工程添加腳本就可以了能扒。

局部安裝

除了全局安裝汰现,我們也可以通過(guò)CocoaPods進(jìn)行安裝业岁。在Podfile上添加相關(guān)的依賴:

pod 'SwiftLint'

然后跟全局方法一樣,在Run Script中添加命令戚扳,但是內(nèi)容有些許的不同:

"${PODS_ROOT}/SwiftLint/swiftlint"
image.png

接下來(lái)就讓我們來(lái)試試看SwiftLint的吧么翰!

使用

在給項(xiàng)目初次接入SwiftLint的時(shí)候,你可能會(huì)被下面這樣的情景給嚇到


image.png

但是呢暴心,不用慌妓盲,我們可以看一下這是什么情況。仔細(xì)觀察一番之后酷勺,我們會(huì)發(fā)現(xiàn)本橙,絕大多數(shù)的Warning都是這個(gè)原因:


image.png

我這一行哪里有空格符?簡(jiǎn)直就是冤枉按嗨摺!但其實(shí)是這樣的贷币,雖然看起來(lái)好像沒(méi)有空格符击胜,但是在換行符之間不應(yīng)該摻雜制表符,也就是說(shuō)你實(shí)際的代碼是這樣的:

\n \tab \n

所以呢役纹,人家的Warning也不是沒(méi)有道理的嘛偶摔。那么我們?cè)撛趺磥?lái)消除這些Warning呢?

首先促脉,我們要確保辰斋,以后我們所碼的代碼不再出現(xiàn)這樣的格式策州,所以我們需要把Text Editing里面的Including whitespace-only lines勾選上:

image.png

這樣可以保證我們今后的換行不再出現(xiàn)制表符的警告,然后宫仗,我們就需要處理現(xiàn)有的代碼」还遥現(xiàn)有的代碼,少說(shuō)也有幾萬(wàn)行藕夫,手動(dòng)改不是要累死人孽糖?這個(gè)時(shí)候就輪到SwiftLint的命令行出場(chǎng)了:

image.png

我們將目錄切換到工程的根目錄之下,然后敲擊如下命令:

swiftlint autocorrect

然后我們就會(huì)發(fā)現(xiàn)毅贮,所有的空格符Warning都消失了办悟。這都得益于我們剛剛所進(jìn)行的命令行操作,它會(huì)將已知的能夠自動(dòng)修復(fù)的Error和Warning都自動(dòng)修復(fù)滩褥,大大的減輕了我們的工作量病蛉。
但是又出現(xiàn)了一個(gè)問(wèn)題,在項(xiàng)目的根目錄之下執(zhí)行自動(dòng)糾正瑰煎,SwiftLint會(huì)將Pods文件夾中的Swift文件也一起糾正了铺然,第三方的框架原則上能不動(dòng)就不動(dòng),那么我們?cè)撛趺崔k呢丢间?
這個(gè)時(shí)候就需要.swiftlint.yml文件了探熔。那么這是一個(gè)什么文件呢?在使用SwiftLint的時(shí)候烘挫,很多時(shí)候我們會(huì)碰到一些自定義的規(guī)則需求诀艰,這個(gè)時(shí)候就需要.swiftlint.yml來(lái)解決問(wèn)題了。

.swiftlint.yml

所謂的.swiftlint.yml其實(shí)就是SwiftLint的一個(gè)配置文件饮六,我們可以通過(guò)這個(gè)配置文件來(lái)修改約束的規(guī)則其垄,以此達(dá)到自定義的效果。把這個(gè)文件放在代碼根目錄下面卤橄。

.swiftlint.yml.png

一般的配置文件大概長(zhǎng)這個(gè)樣子:

excluded: # 執(zhí)行 linting 時(shí)忽略的路徑绿满。 優(yōu)先級(jí)比 `included` 更高。
  - Carthage
  - Pods

line_length:
  warning: 350
  error: 450
  ignores_function_declarations: true
  ignores_comments: true

function_body_length: # 函數(shù)體長(zhǎng)度
  warning: 300
  error: 350

identifier_name:
  min_length: # 只有最小長(zhǎng)度
    error: 1 # 只有錯(cuò)誤

type_body_length: # 類的長(zhǎng)度
  warning: 800
  error: 1200

file_length: # 文件長(zhǎng)度
  warning: 1000
  error: 1500

cyclomatic_complexity: # 代碼復(fù)雜度,默認(rèn)為10
  warning: 30
  error: 35

force_cast: warning # 強(qiáng)制轉(zhuǎn)換(代碼中存在一些前面通過(guò)if判斷過(guò)類型窟扑,后面做的強(qiáng)制轉(zhuǎn)換的代碼)
force_try: warning # try語(yǔ)句判斷

disabled_rules: # 執(zhí)行時(shí)排除舍棄的規(guī)則
  - trailing_whitespace # 每一個(gè)空行不能有空格喇颁,會(huì)與Xcode換行后自動(dòng)對(duì)齊生成的空格沖突,建議排除掉加嚎货。
  - identifier_name # 命名規(guī)則必須按照駝峰原則(可能model中的某些字段與json字段命名沖突橘霎,建議排除掉)
  - type_name # 類型命名規(guī)則限制,以大寫(xiě)字母開(kāi)頭,且長(zhǎng)度在1到20個(gè)字符之間
  - shorthand_operator # 使用+= 殖属, -=姐叁, *=, /=  代替 a = a + 1

2. SwiftLine的使用 - 代碼提交期間的使用

  1. 首先要安裝swiftlint,上面文章已經(jīng)寫(xiě)過(guò)外潜,只需要安裝上去原环,不用在Run Script中添加命令。.swiftlint.yml文件放在根目錄下面

  2. 在代碼提交期間处窥,使用git hooks原理嘱吗,對(duì)提交的代碼進(jìn)行規(guī)范規(guī)則判斷檢查 ,不符合.swiftlint.yml的規(guī)范碧库,就會(huì)報(bào)錯(cuò)柜与、報(bào)警告。 在根目錄下面的hooks文件里面有commit-msg和pre-commit這個(gè)兩個(gè)腳本嵌灰,

C295B40C-AAB8-4FB4-B8D5-432D57671447.png
commit-msg 的腳本內(nèi)容如下:
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message.  The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit.  The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".

# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"

# This example catches duplicate Signed-off-by lines.

forcecommit=$(git config --type=bool hooks.forcecommit)

if [ "$forcecommit" != "true" ]
 then
if [ "$(grep '^feat:' "$1")" == "" ] &&
   [ "$(grep '^fix:' "$1")" == "" ] &&
   [ "$(grep '^lint_error:' "$1")" == "" ] &&
   [ "$(grep '^lint_warning:' "$1")" == "" ] &&
   [ "$(grep '^docs:' "$1")"  == "" ] &&
   [ "$(grep '^style:' "$1")" == "" ] &&
   [ "$(grep '^refactor:' "$1")" == "" ] &&
   [ "$(grep '^test:' "$1")" = "" ] &&
   [ "$(grep '^chore:' "$1")" == "" ]
then
    cat <<\EOF
    ?錯(cuò)誤:提交日志格式錯(cuò)誤; 如需強(qiáng)制提交弄匕,可執(zhí)行以下命令(僅限于本次提交)
        git config hooks.forcecommit true
    我們有如下幾種提交格式可供選擇:
    
    feat: 新功能(feature)
    fix: 修補(bǔ)bug
    lint_error: 處理lint?
    lint_warning: 處理lint??
    docs: 文檔(documentation)
    style: 格式(不影響代碼運(yùn)行)
    refactor: 重構(gòu)(即不是新增功能,也不是修改bug的代碼變動(dòng))
    test: 增加測(cè)試
    chore: 構(gòu)建過(guò)程或輔助工具的變動(dòng)
    
    如 "feat:新增直播間粉絲之間問(wèn)候語(yǔ)"
    ??:冒號(hào)為英文格式沽瞭,切記切記
EOF
    exit 1
fi
else
    git config hooks.forcecommit false
fi

# echo "提交的日志為:$1"
# test "" = "$(grep '^Signed-off-by: ' "$1" |
#    sort | uniq -c | sed -e '/^[   ]*1[    ]/d')" || {
#   echo >&2 Duplicate Signed-off-by lines.
#   exit 1
# }

pre-commit的腳本內(nèi)容如下:
#!/bin/bash

# use for SourceTree And Xcode
if test -d "/opt/homebrew/bin/"; then
  PATH="/opt/homebrew/bin/:${PATH}"
fi
export PATH

# 檢測(cè)swiftLint工具是否安裝
if [ -z "$(which swiftlint)" ]
then
    cat <<\EOF
    設(shè)備上沒(méi)有檢測(cè)到SwiftLint迁匠,請(qǐng)使用以下命令進(jìn)行下載安裝:
    brew install swiftLint
EOF
    exit 1
fi

# 接收l(shuí)int結(jié)果,并進(jìn)行格式化處理
function dealLintResult() {
  while read -r line; do
    FILE_NAME=$(echo "$line" | cut -d : -f 1 | rev | cut -d / -f 1 | rev)
    LINE=$(echo "$line" | cut -d : -f 2)
    COLUMN=$(echo "$line" | cut -d : -f 3)
    VIOLATION_TYPE=$(echo "$line" | cut -d : -f 4 | cut -c 2-)
    VIOLATION=$(echo "$line" | cut -d : -f 5 | cut -c 2-)
    DESCRIPTION=$(echo "$line" | cut -d : -f 6 | cut -c 2-)

    if [ "$VIOLATION_TYPE" == "warning" ]; then
      echo -e "\n??  $VIOLATION \n"
    else
      echo -e "\n? $VIOLATION \n"
    fi
    echo -e "$FILE_NAME: 第${LINE}行 第${COLUMN}列驹溃。- $DESCRIPTION \n"
    echo "---------------------------------------------------------------------"
  done <<<"$1"
  
  printf "\n????♀???提交被阻止城丧,請(qǐng)?jiān)谔峤磺靶迯?fù)好以上問(wèn)題\n"
  cat <<\EOF
  或使用終極命令 git commit -m 'xxx' --no-verify (不建議使用)
EOF
}

EXIT_CODE=0

COMMIT_SWIFT_FILES=()
# 搜集un-staged files中的swift文件
CHANGED_FILES_UNSTAGED=$(git diff --diff-filter=d --name-only -- "*.swift")
if [ "$CHANGED_FILES_UNSTAGED" ]; then
  COMMIT_SWIFT_FILES+=("$CHANGED_FILES_UNSTAGED")
fi

# 搜集staged files中的swift文件
CHANGED_FILES_STAGED=$(git diff --cached --diff-filter=d --name-only -- "*.swift")
if [ "$CHANGED_FILES_STAGED" ]; then
  COMMIT_SWIFT_FILES+=("$CHANGED_FILES_STAGED")
fi

# 遍歷所有添加的swift文件,并對(duì)其逐一進(jìn)行l(wèi)int
while read -r swiftfile; do
  if [ -e "$swiftfile" ]; then
      LINTRESULT=$($(which swiftlint) lint --quiet --path "$swiftfile" --config ".swiftlint.yml")
      if [ -n "$LINTRESULT" ]; then
        dealLintResult "$LINTRESULT"
        EXIT_CODE=1
      fi
  fi
done <<<"${COMMIT_SWIFT_FILES[@]}"

exit $EXIT_CODE

注意 我用 sourcetree clone 到本地的代碼后 .git 目錄下沒(méi)有發(fā)現(xiàn) hooks 文件夾豌鹤,但是通過(guò)終端 git clone 完的倉(cāng)庫(kù)里就有亡哄,我想不明白,sourcetree 只不過(guò)是個(gè) git 客戶端而已布疙,還能給我過(guò)濾掉了文件夾嗎蚊惯。后來(lái)看到別人寫(xiě)的 hooks 的應(yīng)用才明白,對(duì)于任何 Git 倉(cāng)庫(kù)來(lái)說(shuō)鉤子(hooks)都是本地的灵临,而且它不會(huì)隨著 git clone 一起復(fù)制到新的倉(cāng)庫(kù)截型。 但是在終端里的 git clone 密令是可以把它克隆下來(lái)的
參考文章:
https://blog.csdn.net/weixin_42206732/article/details/90737049

上面的腳本配置完了儒溉,接下來(lái)就是代碼提交期間使用swiftlint了宦焦,在終端里面寫(xiě)commit命令,會(huì)報(bào)錯(cuò)誤顿涣,我列出來(lái)兩種:
git commit -m "測(cè)試swiftlint的使用代碼"
錯(cuò)誤1:

YPLetterIndexView.swift 這個(gè)文件寫(xiě)法不規(guī)范

錯(cuò)誤1.png
錯(cuò)誤2:

提交代碼的時(shí)候波闹,調(diào)教文案不規(guī)范。改成如下就OK了涛碑。

git commit -m "feat: 測(cè)試swiftlint的使用代碼"
錯(cuò)誤2.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舔痪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锌唾,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌涕,死亡現(xiàn)場(chǎng)離奇詭異滋捶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)余黎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)重窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惧财,你說(shuō)我怎么就攤上這事巡扇。” “怎么了垮衷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵厅翔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搀突,道長(zhǎng)刀闷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任仰迁,我火速辦了婚禮甸昏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐许。我一直安慰自己施蜜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布雌隅。 她就那樣靜靜地躺著翻默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澄步。 梳的紋絲不亂的頭發(fā)上冰蘑,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音村缸,去河邊找鬼祠肥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梯皿,可吹牛的內(nèi)容都是我干的仇箱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼东羹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剂桥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起属提,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤权逗,失蹤者是張志新(化名)和其女友劉穎美尸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斟薇,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师坎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堪滨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胯陋。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袱箱,靈堂內(nèi)的尸體忽然破棺而出遏乔,到底是詐尸還是另有隱情,我是刑警寧澤发笔,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布盟萨,位于F島的核電站,受9級(jí)特大地震影響筐咧,放射性物質(zhì)發(fā)生泄漏鸯旁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一量蕊、第九天 我趴在偏房一處隱蔽的房頂上張望铺罢。 院中可真熱鬧,春花似錦残炮、人聲如沸韭赘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泉瞻。三九已至,卻和暖如春苞冯,著一層夾襖步出監(jiān)牢的瞬間袖牙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工舅锄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞭达,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓皇忿,卻偏偏與公主長(zhǎng)得像畴蹭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳍烁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容