關(guān)于OCLint
OCLint是一個(gè)靜態(tài)代碼分析工具,提高質(zhì)量和減少缺陷通過(guò)檢查C 典阵、C++ 和Objective-C 代碼和尋找潛在的問(wèn)題
可能的缺陷 - 空的if / else / try / catch / finally語(yǔ)句
未使用的代碼 - 未使用的局部變量和參數(shù)
復(fù)雜的代碼 - 很高的圈復(fù)雜度,NPath復(fù)雜性和太高的NCSS
代碼異味 - 長(zhǎng)方法和參數(shù)列表
長(zhǎng)方法和參數(shù)列表不好的實(shí)踐——倒邏輯和參數(shù)重新分配
…
靜態(tài)代碼分析是一個(gè)來(lái)檢測(cè)對(duì)于編譯不可見(jiàn)的缺陷的關(guān)鍵技術(shù)晕翠。
安裝步驟
1、如果沒(méi)有安裝homebrew,就去官網(wǎng)按照教程安裝一下
2、使用homebrew安裝OCLint和xcpretty
使用第三方的軟件會(huì)比使用xcodebuild方便些
最新xctool的build方法已經(jīng)棄用,不能配合OCLint使用,推薦使用xcpretty
// 安裝OCLint
brew tap oclint/formulae
brew install oclint
// 安裝xcpretty
gem install xcpretty
// 以后可能需要更新
brew update
brew upgrade oclint
報(bào)錯(cuò):Operation not permitted - /usr/bin/rougify 的解決方案
3钟鸵、使用
在終端進(jìn)入項(xiàng)目目錄钉稍,然后替換workspace的名字和scheme的名字,將修改好的命令粘貼到終端執(zhí)行棺耍,等待命令執(zhí)行完畢
myworkspace=haha.xcworkspace # 替換workspace的名字
myscheme=haha # 替換scheme的名字
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -- \
-report-type html -o oclint_result.html \
-rc LONG_LINE=200 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json;
if [ -f ./oclint_result.html ]; then echo '-----分析完畢-----'
else echo "-----分析失敗-----"; fi
中間可能會(huì)在Build Succeeded后面等待一段時(shí)間贡未,這是因?yàn)镺CLint在分析文件
等待命令執(zhí)行完成,終端會(huì)打印出-----分析完畢-----字樣蒙袍,
打開(kāi)項(xiàng)目目錄俊卤,會(huì)看到目錄下會(huì)多出一個(gè)oclint_result.html的文件
如果沒(méi)有使用cocoapods,則去掉myworkspace=haha.xcworkspace害幅、-workspace $myworkspace消恍、-workspace $myworkspace,然后再在終端執(zhí)行
另外可以自己建一個(gè)xx.sh的文件以现,將上面代碼粘貼進(jìn)去狠怨,每次在命令行進(jìn)入xx.sh所在目錄執(zhí)行bash xx.sh就可以了
有時(shí)候會(huì)遇到問(wèn)題:
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
解決方法:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
有時(shí)候編譯不通過(guò)報(bào)錯(cuò):
解決方案
參考文章
解決了约啊,Podfile添加hook:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['COMPILER_INDEX_STORE_ENABLE'] = "NO"
end
end
end
同時(shí),pod的主工程也需要設(shè)置COMPILER_INDEX_STORE_ENABLE這個(gè)值為NO
4佣赖、查看oclint_result.html文件
OCLint的分析結(jié)果:
優(yōu)先級(jí)的級(jí)別是從Priority 1, Priority 2, Priority 3 依次降低的
Total Files 總文件數(shù)
Files with Violations 違規(guī)文件數(shù)
Compiler Warnings 表示項(xiàng)目中的警告??
Compiler Errors 表示編譯錯(cuò)誤
Location 表示警告的位置
報(bào)告中的描述其實(shí)非常清晰恰矩,一般找到代碼位置,結(jié)合代碼理解下憎蛤,自己基本都能明白了
5外傅、自定義規(guī)則
上面的命令中
-e Pods
表示移除Pods文件夾里代碼的分析, 如果有繼續(xù)-e Debug.m
-report-type html
表示分析后輸出的文件類(lèi)型為HTML,查看其他支持的文件類(lèi)型
-o oclint_result.html
表示輸出到oclint_result.html
這個(gè)文件中()
-rc LONG_LINE=200
表示每行最大字節(jié)長(zhǎng)度為200(默認(rèn)值為100俩檬,感覺(jué)在OC中100完全不夠用拔取)
一些常用規(guī)則的注釋
# --命名
# 變量名字最長(zhǎng)字節(jié)
#-rc=LONG_VARIABLE_NAME=20 \
# 變量名字最短字節(jié)
#-disable-rule ShortVariableName \
# --size
# 圈復(fù)雜度
#-re=CYCLOMATIC_COMPLEXITY=10 \
# 每個(gè)類(lèi)最行數(shù)
#-rc=LONG_CLASS=700 \
# 每行字節(jié)數(shù)量
#-rc=LONG_LINE=200 \
# 每個(gè)方法行數(shù)
#-rc=LONG_METHOD=80 \
# 忽略注釋后括號(hào)后的有效代碼行數(shù)
#-rc=NCSS_METHOD=40 \
# 嵌套深度
#-rc=NESTED_BLOCK_DEPTH=5 \
# 字段數(shù)量
#-rc=TOO_MANY_FIELDS=20 \
# 方法數(shù)量
#-rc=TOO_MANY_METHODS=30 \
# 方法參數(shù)
#-rc=TOO_MANY_PARAMETERS=6
oclint-json-compilation-database命令手冊(cè)
oclint命令手冊(cè)
OCLint自定義規(guī)則介紹
OCLint全部規(guī)則介紹
文檔里面有每個(gè)規(guī)則的demo和對(duì)應(yīng)的命令名字。