手把手教系列之 -- iOS 代碼自動整理

"這誰寫的代碼,前邊的空格手敲的啊棺棵,我正常換行居然沒對齊楼咳?!""這個 else 是跟哪個 if 配對的臥槽".......如果你也這樣抱怨過烛恤,恭喜你母怜,來對了,請接著往下看缚柏。
誰都想自己寫的代碼清清爽爽苹熏,也都想自己工作中看到的代碼清清爽爽,或者最起碼盡量風(fēng)格統(tǒng)一。但是代碼格式這種重復(fù)勞動的問題轨域,如果旁邊坐一個美女幫我添一個空格袱耽,做一個換行該多好啊。如果你是這樣想的干发,可以右上角xx出門找x家朱巨、x天,地上小紙片打個電話談價錢去了铐然。我這里要分享的是用 spacecommander 工具在 Xcode 8.x 時代實現(xiàn)對 OC 的自動化蔬崩,另外 spacecommandergit 更配哦,好了搀暑,飆車正式開始沥阳!

1. 準(zhǔn)備工作和環(huán)境配置

1.1 下載源文件

從上邊的 github 鏈接下載 spacecommander 源文件并解壓。你可以將文件放到自己項目的工程目錄下自点,這樣 git 可以將 spacecommander 源文件自動同步到遠(yuǎn)端桐罕,其他同事更新代碼之后只需要執(zhí)行命令即可,更方便桂敛。我這里是先放在了電腦的文稿目錄下功炮。

1.2 配置

使用命令行 cd 到工程目錄,然后使用 spacecommander 目錄下的 setup-repo.sh 初始化環(huán)境术唬。命令類似于: $ /Users/mac/Documents/spacecommander/setup-repo.sh薪伏,
前邊是 spacecommander 源文件所在的目錄,自行替換即可粗仓,或者更簡單的直接將 setup-repo.sh 文件拖拽到命令行嫁怀,系統(tǒng)會自動生成路徑信息,然后直接回車即可借浊。之后你的命令行大概會是這個樣子:

set-up
而你的工程目錄下會多出這么三個鬼東西:
spacecommander-setupFile.png

  1. 左起第一個是個快捷方式塘淑,指向我們剛剛解壓的 spacecommander 源文件中的 .clang-format 腳本。使用編輯器打開這個腳本你會發(fā)現(xiàn)
    spacecommander-clangFormat.png
    其實我們要格式化的樣式都是在這文件中定義的蚂斤,包括基于的代碼風(fēng)格( Google / LLVM )存捺、tab 按鍵縮進(jìn)的長度等等。不明白某個選項的可以搜索或者直接搜 " clang-format 配置"曙蒸。這里不贅述捌治。或者可以自己寫個小 demo纽窟,弄幾個 if-else具滴、for循環(huán)、block 师倔,方法和屬性等构韵,試著修改一下這個文件周蹭,看格式化后是什么樣子,印象更深刻疲恢,活著就是折騰嘛凶朗。
  2. 中間是一個 .git 的文件夾,點進(jìn)去會發(fā)現(xiàn)有一個hooks 的文件夾显拳,繼續(xù)點進(jìn)去有一個 pre-commit 的可執(zhí)行文件棚愤。hooks 顧名思義,鉤子的意思杂数,詳見git 鉤子官方說明宛畦。說白了拓萌,其實就類似于是 OC 中的 block 模式然爆,使用 git 的小伙伴們對 git commit 提交代碼肯定再熟悉不過了,不過拖云,假如我們想在提交每次提交代碼之前進(jìn)行一些操作那伐,例如:格式化代碼 : ) 踏施。那這個鉤子就相當(dāng)于是 git 官方給我們暴露出來的 block 回調(diào),可以在每次執(zhí)行 commit 之前自動調(diào)用罕邀,從而達(dá)到自動化的目的畅形。
  3. 看到最后一個文件,是不是特別熟悉诉探?和我們工程目錄下的忽略文件一毛一樣日熬!它的作用就是忽略文件(呸!廢話I隹琛)竖席。其實這個是因為我初始化時的目錄沒跟我原有的 .gitignore 所在目錄一致導(dǎo)致的。也就是說阳液,setup-repo.sh 會自動檢測當(dāng)前目錄下是否有 .gitignore 文件,如果有就會自動在后邊追加 .clang-format揣炕,如果沒有就會新建一個忽略文件并添加 .clang-format帘皿。目的當(dāng)然是為了不同步 .clang-format 文件。因為 .clang-format 只是個快捷方式畸陡,當(dāng)被同步到其他電腦上時鹰溜,這個快捷方式很大程度上是無效的,所以就不需要被同步到遠(yuǎn)端丁恭。所以需不需要這個文件被忽略曹动,取決于你的 spacecommander 源文件的目錄。如果 spacecommander 也在你的工程目錄下并且被同步到了遠(yuǎn)端牲览,那這個快捷方式就可以不用忽略墓陈,這樣其他的協(xié)作小伙伴 pull 之后什么操作都不用,就可以直接使用自動整理代碼的功能。否則就不需要同步贡必,到時候喊你的小伙伴再看一遍這篇文章即可兔港,我真是個心機婊啊 : )。

2. 整理代碼

2.1 常用的格式化命令

看到現(xiàn)在是不是對于自動化整理代碼的流程大致有印象了呢仔拟。接下來就是見證奇跡的時刻衫樊。在 spacecommander 的源文件目錄下,除了 setup-repo.sh 之外利花,其實還有好幾個 .sh 文件科侈。它們就是我們接下來要使用的命令們。

  • format-objc-file.sh:整理單個文件的命令炒事,用法同 setup-repo.sh 一樣臀栈,也是通過路徑加載命令,然后空格加需要格式化文件的路徑即可羡洛。
  • format-objc-files.sh:英語老師教我們挂脑,名詞加 s 代表復(fù)數(shù),所以這個命令是用來格式化多個文件的欲侮,用法同上崭闲。需要被格式化的文件路徑之間用空格隔開即可。
  • format-objc-files-in-repo.sh:in-repo威蕉,顧名思義刁俭,就是整理整個倉庫下的所有文件。這個命令建議不要一開始就使用韧涨,請閱讀完 排除整理 部分之后再使用牍戚。

說完了格式化需要用到的命令,我們暫時還不能立即使用虑粥,還要知道怎么避免某些文件不被格式化如孝,因為現(xiàn)在的工程基本都會用到很多的第三方,而這些文件往往不需要再次整理娩贷。好在這些東西 spacecommander 都已經(jīng)為我們想到了第晰,配置起來也是相當(dāng)?shù)暮唵危逻厱榻B到彬祖。當(dāng)然你可以自己寫個小 demo茁瘦,或者使用spacecommander 目錄下Testing Support 的測試代碼進(jìn)行測試。這里貼幾張格式化官方例子的前后對比圖吧:

inlineBefore

inlineAfter.png

blockBefore

blockAfter
dictionaryBefore

dictionaryAfter

2.2 自動化整理

上邊我們提到 git 鉤子的問題储笑,按照上述步驟配置完成之后甜熔,其實我們已經(jīng)就已經(jīng)實現(xiàn)了自動化整理代碼的目的。試一下突倍,修改項目中的某個文件腔稀,然后 git add . 之后 git commit -m "提交備注信息"盆昙,注意一定要是這兩個命令,如果使用 git commit -am "提交備注信息" 的話烧颖,spacecommander 是無法識別要整理的文件的弱左。正常情況下會提示

gitCommit

。這就說明要提交的文件不符合代碼規(guī)范的要求炕淮。接下來我們可以有兩種操作:使用git commit --no-verify強制提交拆火,這不是我們的重點⊥吭玻或者使用spacecommander路徑/format-objc-files.sh -s先對代碼進(jìn)行格式化们镜,這里的-s后綴參數(shù)是-stage的意思,是只對暫存區(qū)润歉,也就是要提交的代碼進(jìn)行格式化模狭。成功格式化之后會提示Formatting complete。然后我們再次運行 git commit -m對代碼進(jìn)行提交即可踩衩。

3. 排除不想整理的代碼

3.1 排除不需要格式化的文件夾

默認(rèn)情況下嚼鹉,spacecommander 已經(jīng)將 PodsCarthage 路徑下的文件排除掉了

podIgnore

所以不用擔(dān)心這些文件。如果是手動拖入的第三方驱富,我們可以在項目工程目錄下锚赤,創(chuàng)建一個名為 .formatting-directory-ignore 的文件,里邊寫入需要忽略的文件夾路徑即可褐鸥。

3.2 排除不需要格式化的單個文件

上邊說到的是文件夾忽略线脚,那如果是單個文件要怎么做呢?不用怕叫榕,spacecommander 也支持浑侥。我們只需在需要忽略的文件的頭部,注意是最頭部晰绎,添加 #pragma Formatter Exempt 或者// MARK: Formatter Exempt 即可寓落。

3.3 部分代碼避免格式化

同樣,一個文件內(nèi)的某幾行代碼同樣也可以在整理范圍之外荞下。使用到的命令為:// clang-format off// clang-format on伶选。就像這樣:

clangeOff

3.4 bug。注冊推送時的代碼格式化之后老會多一個分號锄弱,像這樣:

clangFormatBug

考蕾,我嘗試使用 // clang-format off 依舊不好使祸憋,無奈只能手動修改会宪,之后使用 git commit --no-verify 強制提交了。

4. 快捷鍵配置

4.1 快捷鍵

如果我們每次提交代碼都需要輸入那么長的路徑信息和命令蚯窥,估計代碼格式化工具使用的人也不多掸鹅。幸運的是塞帐,我們可以通過一些設(shè)置來簡化這些操作。這種簡化是屬于命令行層級的操作巍沙,我使用的是 zsh 命令行葵姥,如果你使用的是系統(tǒng)命令行,修改思想完全一致句携,只不過是文件不一樣榔幸。

4.2 路徑快捷鍵

zsh 命令行需要修改用戶根目錄下的 .zshrc 文件,在文件末尾輸入export SPACECOMMANDER="/Users/mac/Documents/spacecommander"矮嫉,意思是使用SPACECOMMANDER 代表后邊的路徑信息削咆。重啟命令行工具,輸入space之后按 tab 鍵即可自動填充SPACECOMMANDER蠢笋。

4.3 命令快捷鍵

當(dāng)然我們可以在上邊路徑快捷鍵的基礎(chǔ)上拨齐,直接在路徑快捷鍵的后邊后綴命令,例如SPACECOMMANDER format-objc-files.sh -s 來對整理暫存區(qū)的代碼昨寞。不過這依然不夠快捷瞻惋,是吧?所以我們需要使用更加方便的自定義命令快捷鍵援岩。還是修改 .zshrc 文件歼狼,這次我們添加如下內(nèi)容:
alias formatstage="/Users/mac/Documents/spacecommander/format-objc-files.sh -s"
alias formatfile="/Users/mac/Documents/spacecommander/format-objc-file.sh"
alias formatall="/Users/mac/Documents/spacecommander/format-objc-files-in-repo.sh"
重啟命令行工具窄俏,輸入format之后按tab我們剛剛添加的三條命令就自動提示出來了蹂匹。

5. 結(jié)束語

至此,關(guān)于日常開發(fā)使用 spacecommander 自動化整理代碼就介紹完了凹蜈,配置完之后限寞,開發(fā)的流程基本是這個樣子:
修改代碼 -> git add . -> git commit -m -> formatstage -> git commit -m
即可實現(xiàn)代碼自動整理,動手試一下吧仰坦,感謝您的閱讀履植!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悄晃,隨后出現(xiàn)的幾起案子玫霎,更是在濱河造成了極大的恐慌,老刑警劉巖妈橄,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶近,死亡現(xiàn)場離奇詭異,居然都是意外死亡眷蚓,警方通過查閱死者的電腦和手機鼻种,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沙热,“玉大人叉钥,你說我怎么就攤上這事罢缸。” “怎么了投队?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵枫疆,是天一觀的道長。 經(jīng)常有香客問我敷鸦,道長息楔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任扒披,我火速辦了婚禮钞螟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谎碍。我一直安慰自己鳞滨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蟆淀。 她就那樣靜靜地躺著拯啦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熔任。 梳的紋絲不亂的頭發(fā)上褒链,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音疑苔,去河邊找鬼甫匹。 笑死,一個胖子當(dāng)著我的面吹牛惦费,可吹牛的內(nèi)容都是我干的兵迅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薪贫,長吁一口氣:“原來是場噩夢啊……” “哼恍箭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞧省,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扯夭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鞍匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體交洗,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年橡淑,在試婚紗的時候發(fā)現(xiàn)自己被綠了构拳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隐圾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掰茶,我是刑警寧澤暇藏,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站濒蒋,受9級特大地震影響盐碱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沪伙,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一瓮顽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧围橡,春花似錦暖混、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至收擦,卻和暖如春贮配,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塞赂。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工泪勒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宴猾。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓圆存,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仇哆。 傳聞我的和親對象是個殘疾皇子辽剧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)税产,斷路器怕轿,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 前言 眾所周知,程序員們的代碼風(fēng)格因人而異辟拷,好在有自動規(guī)范代碼格式工具可以幫助解決代碼風(fēng)格迥異的問題撞羽。結(jié)合同事的推...
    who_young閱讀 3,790評論 5 3
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 23,871評論 8 183
  • 畢業(yè)了衫冻,不管好壞诀紊,工作總算要落實了,讓我開心的是:終于不用再靠爸爸媽媽養(yǎng)隅俘。今年22歲邻奠,爺爺奶奶和爸爸媽媽養(yǎng)了...
    張西西666閱讀 265評論 0 1
  • 含苦養(yǎng)兒千日累碌宴,百日學(xué)步笑心慰杀狡。 兒從百步不孝母,滴汗不從兒流出贰镣。 慈母本因天下事呜象,不孝兒郎天不為。 兒從百步無孝...
    綴滿星星的夜空只有我閱讀 142評論 0 3