iOS專案自動程式碼風格規範化--團隊協作的福音

醬油蔥發表於2018-02-22

本文遷移自本人簡書賬號醬油蔥, 後續不會再在簡書更新文章, 具體原因可以檢視簡書CEO盛讚程式設計師出軌率高“真實、新鮮、多元” ,對不起打擾了

程式碼風格

這是個永恆的話題, 每個程式設計師都有自己的看法和習慣. 但是行業裡總會有些公認的規則, 公司裡也需要一個統一的標準. 所以這個話題直接略過, 重點談如何用工具保證一個團隊輸出內容風格的一致性.

自動Format

簡書上已有不少相關的內容, 例如葉孤城的這篇文章. 目前, 本人使用的也是Square公司開源的"Clang-Format"進行程式碼規範. 一直以來用的都挺好.

但是自從Swift出世後, 問題就來了. Square公司的spacecommander專案不支援Swift檔案的處理. 而且Square公司暫時也沒有開源關於Swift的Format工具. 所以只能另尋它法.

還好, 這邊有一個牛人開發了相應的Swift格式化工具SwiftFormat. 而且同樣流暢的命令列操作, 可以讓我們的工作變得輕鬆.

詳細用法

安裝

支援Homebrew安裝

brew update brew install swiftformat

也支援專案編譯安裝. 這個比較麻煩, 大夥需要的話就直接去github上看README文件吧

使用

由於工具開發者本人實現了XCode 8的Extension, 所以希望使用選單項或者Hot Key的朋友可以嘗試一下. 文件已經描述的很詳細了.

本人用的是直接Hooks到倉庫git上, 步驟如下:

  1. 進入本地專案目錄, 建立或開啟.git/hooks/pre-commit檔案

cd *** //***為專案路徑 vi .git/hooks/pre-commit

  1. 如果專案檔案之前已存在, 則在下方新增以下內容(與文件說明略有出入, 考慮到CocoaPods/Carthage問題)
git status --porcelain | grep -e '^[AM]\(.*\).swift$' | cut -c 3- | while read line; do
  swiftformat ${line};
  git add $line;
done
複製程式碼

如果有童鞋沒有將.gitignore檔案對PodsCarthage目錄進行過濾*(雖然一般人都不會這麼做ORZ)*, 那麼可以考慮換成以下內容

git status --porcelain | grep -v 'Pods/' | grep -v 'Carthage/' | grep -e '^[AM]\(.*\).swift$' | cut -c 3- | while read line; do
  swiftformat ${line};
  git add $line;
done
複製程式碼
  1. 如果專案檔案之前不存在, 則新增以下內容
#!/bin/bash
git status --porcelain | grep -e '^[AM]\(.*\).swift$' | cut -c 3- | while read line; do
  swiftformat ${line};
  git add $line;
done
複製程式碼
  1. 儲存退出, 修改該檔案的執行許可權. 從此萬事大吉

chmod +x .git/hooks/pre-commit

示例

Format前
檢視內容
提交時自動Format
自動Format結果

進一步的問題

ObjectiveC老專案, 新增新的Swift語言進行混編時, 如何進行程式碼自動規範化?

很簡單, 首先先使用Square公司的spacecommander專案工具指令碼setup-repo.sh對專案進行初始化. 這個指令碼會自動幫你在專案的.git/hooks目錄下建立pre-commit檔案並填入指令碼內容.

然後, 在第二行插入以下內容(就是上面提及的SwiftFormat指令碼):

git status --porcelain | grep -e '^[AM]\(.*\).swift$' | cut -c 3- | while read line; do
  swiftformat ${line};
  git add $line;
done
複製程式碼

考慮到我們團隊可能需要保留未使用的引數, 所以可以修改為以上內容為:

git status --porcelain | grep -e '^[AM]\(.*\).swift$' | cut -c 3- | while read line; do
  swiftformat --disable unusedArguments ${line};
  git add $line;
done
複製程式碼

儲存退出. 從此你就能滿地圖的亂寫OC/Swift程式碼了. 媽媽再也不用擔心我的格式問題了!

程式碼格式化規範如何調整

目前還真沒有比較好的辦法. 正如spacecommander專案提及的: You may wish to fork [ Space Commander] to apply your team's particular set of formatting rules (more details below), or clone to enjoy Square's flavor of Objective-C formatting.

如果你們團隊希望使用自己的規範, 基本只能考慮fork專案, 然後在本地進行修改生成新的pods, 再做匯出.

SwiftFormat專案則提供了命令列引數的方式進行部分風格設定項:

部分風格設定

目前SwiftFormat的版本為0.24.6, 希望能在未來的版本中看到更多的改進內容.

以上內容, 如有問題或錯誤, 可以隨時與本人聯絡. 感謝閱讀!

相關文章