Xcode代碼規範之SwiftLint配置

Xcode代碼規範之SwiftLint配置

前言

  • 最近公司大佬考慮將項目代碼規範化, 然而自Xcode9以後,Xcode的插件基本處於廢棄的狀態大部分插件都是在一年前就中止更新了;
  • 因而在谷歌找到了一款強大的代碼規範工具SwiftLint
  • SwiftLintRealm 推出的一款 Swift 代碼規範檢查工具, SwiftLint 基於 Github 公佈的 Swift 代碼規範進行代碼檢查,而且可以很好的和 Xcode 整合
  • Github 公佈的 Swift 代碼規範--原文
  • Github 公佈的 Swift 代碼規範--中文
  • 配置好全部的設置以後,在 Xcode 中執行編譯時,SwiftLint 會自動運行檢查,不符合規範的代碼會經過警告或者 紅色錯誤 的形式指示出來
  • 支持自定義規則,可禁用或者開啓某一些規則

一. 安裝SwiftLint

  • SwiftLint目前有三種安裝方式可供選擇,能夠根據本身的項目須要自行選擇

1. 安裝全局配置(Homebrew 安裝)

Homebrew

  • Homebrew, Mac系統的包管理器,用於安裝NodeJS和一些其餘必需的工具軟件, 輸入如下代碼安裝:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
複製代碼

譯註:在Max OS X 10.11(El Capitan)版本中,homebrew在安裝軟件時可能會碰到/usr/local目錄不可寫的權限問題。可使用下面的命令修復:git

sudo chown -R `whoami` /usr/local
複製代碼
  • Homebrew 會自動安裝最新版本
  • 打開終端輸入如下代碼:
brew install swiftlint
複製代碼

安裝成功,以下圖所示:

Homebrew 安裝

2. 使用 CocoaPods 安裝

  • 這種方式只能針對單個項目有效,若是你想要針對不一樣的項目使用不一樣的SwiftLint 版本,這是一種很好的解決方案
  • 須要注意的是使用這種方案會將整個SwiftLint以及他的依賴包的完整資源文件都安裝到 Pods/ 目錄中去,因此在使用版本管理工具好比 git/svn 時要注意設置忽略相關目錄
  • CocosPods安裝和安裝第三方框架同樣
  • 在根目錄建立Podfile
pod 'SwiftLint'
複製代碼

3. 使用安裝包

SwiftLint 還支持使用 pkg 安裝包進行安裝,在官方的 Github 頁面能夠找到最新發布的安裝包github

二. 查看SwiftLint的所有命令

  • 等待安裝完成,在終端輸入 swiftlint help 能夠查看全部可用的命令:

SwiftLint的全部命令

各個命令註釋json

//查看全部命令
swiftlint help

//忽略空格致使的警告和錯誤
swiftlint autocorrect

//輸出全部的警告和錯誤
swiftlint lint

//查看全部可得到的規則以及對應的 ID
swiftlint rules

//產看當前版本號
swiftlint version
複製代碼
  • 咱們將目錄切換到工程的根目錄之下,而後敲擊以下命令:
swiftlint autocorrect
複製代碼

而後咱們就會發現,全部的空格符Warning都消失了。這都得益於咱們剛剛所進行的命令行操做,它會將已知的可以自動修復的Error和Warning都自動修復,大大的減輕了咱們的工做量。swift

三. SwiftLint的使用

安裝完成後,須要在Xcode中配置相關設置,才能使 SwiftLint 在 Xcode 中自動檢測代碼規範。配置也很簡單,只須要在 Xcode 的 Build Phases 中新建一個 Run Script Phase 配置項,在裏面添加相關代碼後,編譯便可!api

  • 配置代碼添加步驟
  • 須要將相關腳本添加到紅色框內

配置代碼添加步驟

1. 全局安裝腳本添加方式數組

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

2. CocoaPods安裝腳本添加xcode

"${PODS_ROOT}/SwiftLint/swiftlint"
複製代碼
  • 這裏實際上是設置了一個自動編譯腳本,每次運行編譯都會自動執行這個腳本
  • 若是正確安裝了 SwiftLint,就會執行 SwiftLint 中的代碼規範檢查,若是沒有安裝,腳本會拋出一個沒有安裝 SwiftLint 並提示下載的警告,方便提醒團隊團隊中沒有安裝的成員。
  • 固然,你也能夠設置爲強制要求安裝,這時若是沒有安裝則沒法經過編譯。只須要在腳本中
echo "warning: ..."
複製代碼

以後添加一行代碼:ruby

exit 1
複製代碼
  • 這樣一來,若是沒有安裝 SwiftLint,編譯時會直接拋出一個編譯錯誤而非警告,提示須要安裝 SwiftLint。

3. 配置完成後,command+B編譯bash

  • 若是你的是正在開發中的項目, 你可能會發現你的項目提示999+的黃色警告和999+的紅色錯誤
  • 甚至你會發現甚至一些空格和一些系統的方法和註釋也會報錯或者警告
  • SwiftLint默認方法名或者註釋不得超過120個字符

測試項目

  • Swift Lint 在完成上述操做以後,便已經生效。可是,若是以爲默認的風格過於嚴格,或者項目組有另外的要求,Swift Lint 也能夠定製相應的風格,或者禁用某些規則。
  • SwiftLint 的所有規則能夠在:Source/SwiftLintFramework/Rules 目錄內找到

四. 自定義配置

  • 當你編譯過項目後,看到999+的警告和錯誤,是否是第一反應就是要放棄了,其實否則
  • 仔細看一下具體的錯誤,會發現好多都是第三方庫的代碼規範問題,並且好多問題的級別被設置成爲了 error
  • 第三方庫的代碼規範問題,這個鍋咱們可不能背
  • 這裏咱們能夠作一些配置,讓 SwiftLint 在作代碼規範檢查的時候自動忽略 CocoaPodsCarthage 等包管理器引入的第三方庫(固然,手動導入的第三方庫也能設置忽略)

1. 建立配置文件

  • 首先須要在項目的根目錄下新建一個名爲 .swiftlint.yml 的配置文件
  • 打開終端, cd 到項目根目錄下
  • 輸入: touch .swiftlint.yml
  • 執行完該命令後, 在文件夾中你可能找不到該yml格式文件,那是由於文件被隱藏了
  • 關於隱藏/顯示隱藏文件(命令同樣): command + shift + .
  • 下面咱們來認識一下主要的幾個配置選項
disabled_rules: # 禁用指定的規則
  - colon
  - comma
  - control_statement
opt_in_rules: # 啓用指定的規則
  - empty_count
  - missing_docs
  # 能夠經過執行以下指令來查找全部可用的規則:
  # swiftlint rules
included: # 執行 linting 時包含的路徑。若是出現這個 `--path` 會被忽略。
  - Source
excluded: # 執行 linting 時忽略的路徑。 優先級比 `included` 更高。
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift
複製代碼

2. 在代碼中關閉某個規則

能夠經過在一個源文件中定義一個以下格式的註釋來關閉某個規則:框架

// swiftlint:disable <rule>
複製代碼

在該文件結束以前或者在定義以下格式的匹配註釋以前,這條規則都會被禁用:

// swiftlint:enable <rule>
複製代碼

例如:

// swiftlint:disable opening_brace
    func initTakeScreenshot(launchOptions: [AnyHashable: Any]?){
        // swiftlint:enable opening_brace
        if let options = launchOptions {
            let userInfo = options[UIApplicationLaunchOptionsKey.remoteNotification]
            NotificationCenter.default.post(name: Notification.Name.UIApplicationUserDidTakeScreenshot, object: userInfo)
        }
    }
複製代碼

規則關閉以前

Snip20180207_1.png

規則關閉以後

Snip20180207_2.png

也能夠經過添加 :previous, :this 或者 :next 來使關閉或者打開某條規則的命令分別應用於前一行,當前或者後一行代碼。

例如:

// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
複製代碼

3. 忽略引入的第三方庫

  • 1). 忽略CocoaPods導入的第三方庫
excluded: 
  - Pods
複製代碼
  • 2). excluded 配置項用來設置忽略代碼規範檢查的路徑,能夠指定整個文件夾
  • 好比若是你的項目使用 Carthage 管理第三方庫的話,能夠將 Carthage 目錄添加到忽略列表:
excluded: 
  - Pods
  - Carthage
複製代碼
  • 3). 指定精確路徑下的文件,經過 - xxxx 的形式列在下面就能夠了
excluded: # 執行 linting 時忽略的路徑。 優先級比 `included` 更高。
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift
複製代碼

4. 嵌套配置

SwiftLint 支持經過嵌套配置文件的方式來對代碼分析過程進行更加細緻的控制。

  • 在你的根 .swiftlint.yml 文件裏設置 use_nested_configs: true 值。
  • 在目錄結構必要的地方引入額外的 .swiftlint.yml 文件。
  • 每一個文件被檢查時會使用在文件所在目錄下的或者父目錄的更深層目錄下的配置文件。不然根配置文件將會生效。
  • excludedincluded,和 use_nested_configs 在嵌套結構中會被忽略。

5. 自動更正

  • SwiftLint 能夠自動修正某些錯誤,磁盤上的文件會被一個修正後的版本覆蓋。
  • 請確保在對文件執行 swiftlint autocorrect 以前有對它們作過備份,不然的話有可能致使重要數據的丟失。
  • 由於在執行自動更正修改某個文件後頗有可能致使以前生成的代碼檢查信息無效或者不正確,因此當在執行代碼更正時標準的檢查是沒法使用的。

五. 最後貼上官方示例

disabled_rules: # 執行時排除掉的規則
  - colon
  - comma
  - control_statement
opt_in_rules: # 一些規則僅僅是可選的
  - empty_count
  - missing_docs
  # 能夠經過執行以下指令來查找全部可用的規則:
  # swiftlint rules
included: # 執行 linting 時包含的路徑。若是出現這個 `--path` 會被忽略。
  - Source
excluded: # 執行 linting 時忽略的路徑。 優先級比 `included` 更高。
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

# 可配置的規則能夠經過這個配置文件來自定義
# 二進制規則能夠設置他們的嚴格程度
force_cast: warning # 隱式
force_try:
  severity: warning # 顯式
# 同時有警告和錯誤等級的規則,能夠只設置它的警告等級
# 隱式
line_length: 110
# 能夠經過一個數組同時進行隱式設置
type_body_length:
  - 300 # warning
  - 400 # error
# 或者也能夠同時進行顯式設置
file_length:
  warning: 500
  error: 1200
# 命名規則能夠設置最小長度和最大程度的警告/錯誤
# 此外它們也能夠設置排除在外的名字
type_name:
  min_length: 4 # 只是警告
  max_length: # 警告和錯誤
    warning: 40
    error: 50
  excluded: iPhone # 排除某個名字
variable_name:
  min_length: # 只有最小長度
    error: 4 # 只有錯誤
  excluded: # 排除某些名字
    - id
    - URL
    - GlobalAPIKey
reporter: "xcode" # 報告類型 (xcode, json, csv, checkstyle)
複製代碼

附錄:

原文連接:https://github.com/realm/SwiftLint/blob/master/README.md 譯文連接:https://github.com/realm/SwiftLint/blob/master/README_CN.md

相關文章
相關標籤/搜索