第1步:安裝 oclint
brew install oclint
第2步:構(gòu)建 Xcode 工程
用命令行工具 xcodebuild
命令格式為 xcodebuild [options]
由于需要將輸出的日志保存起來,所以需要運行如下命令:
xcodebuild [options] | tee xcodebuild.log
完整例子:Xcode 工程名為 OCLintDemo,構(gòu)建命令如下:
xcodebuild build -scheme OCLintDemo | tee xcodebuild.log
日志會在終端中輸出,同時會保存到 xcodebuild.log 文件中。
第3步:格式化日志
用 OCLint 的 oclint-xcodebuild
命令將第2步的日志文件 xcodebuild.log 格式化為 JSON 格式的文件, 運行 oclint-xcodebuild
后自動創(chuàng)建 compile_commands.json 文件。
NOTE:由于 oclint-xcodebuild
已經(jīng)不再維護,推薦使用 xcpretty 程序,安裝方式:
gem install xcpretty
這個后面再詳說。
第4步:分析日志
這一步也即是分析代碼。
運行 oclint-json-compilation-database
命令,即會輸出分析的結(jié)果。包含的信息有不符合規(guī)范的個數(shù)、在文件中的位置,規(guī)范的類別等等。默認(rèn)是在終端中輸出,也可以指定參數(shù)按特定格式輸出到文件中,如生成 HTML 文件:
oclint-json-compilation-database -- -report-type=html -o result.html
報告內(nèi)容長這樣:
其他
規(guī)則文件目錄
/usr/local/Cellar/oclint/0.13/lib/oclint/rules
這個目錄下是一些.dylib文件,oclint 就是基于這些文件對代碼進行規(guī)則檢查的。如 libLongLineRule.dylib
,是單行字符數(shù)限制規(guī)則。
以上步驟可以寫到一個 shell 腳本文件中,在 Xcode 工程根目錄中執(zhí)行腳本就可以自動生成報告。腳本代碼如下(工程名為 OCLintTest):
#/usr/bin/bash
# 先清除緩存
echo 'CLEANING DERIVED DATA...'
xcodebuild clean -scheme OCLintTest
# 第1步,構(gòu)建Xcode工程,生成.log文件
echo 'BUILDING...'
xcodebuild_log_file_name=xcodebuild.log
xcodebuild build -scheme OCLintTest | tee $xcodebuild_log_file_name
# 第2步,將第1步的.log格式化為json
echo 'GENERATING JSON...'
oclint-xcodebuild
echo 'GENERATE SUCCEEDED'
# 第3步,分析日志,生成報告
echo 'ANALYZING...'
report_file_name=OCLintTest_report.html
oclint-json-compilation-database -- -report-type html -o $report_file_name
echo 'ANALYZE SUCCEEDED'
echo 'REUSLT FILE NAME : '$report_file_name
rm $xcodebuild_log_file_name # 刪除中間文件
rm compile_commands.json
open $report_file_name
設(shè)置系統(tǒng)提供的規(guī)則閾值方法如下:
-rc <threshold_name>=<new_value>
-rc CYCLOMATIC_COMPLEXITY = 15 -rc LONG_LINE = 50```
系統(tǒng)提供的規(guī)則,可以設(shè)定閾值的如下:
名稱 描述 默認(rèn)閾值
CYCLOMATIC_COMPLEXITY 方法的循環(huán)復(fù)雜性(圈負(fù)責(zé)度) 10
LONG_CLASS C類或Objective-C接口,類別,協(xié)議和實現(xiàn)的行數(shù) 1000
LONG_LINE 一行代碼的字符數(shù) 100
LONG_METHOD 方法或函數(shù)的行數(shù) 50
LONG_VARIABLE_NAME 變量名稱的字符數(shù) 20
MAXIMUM_IF_LENGTH if希塊的行數(shù) 15
MINIMUM_CASES_IN_SWITCH switch語句中的case數(shù) 3
NPATH_COMPLEXITY 方法的NPath復(fù)雜性 200
NCSS_METHOD 一個沒有注釋的方法語句數(shù) 30
NESTED_BLOCK_DEPTH 塊或復(fù)合語句的深度 5
SHORT_VARIABLE_NAME 變量名稱的字符數(shù) 3
TOO_MANY_FIELDS 類的字段數(shù) 20
TOO_MANY_METHODS 類的方法數(shù) 30
TOO_MANY_PARAMETERS 方法的參數(shù)數(shù) 10