前言
每一個項目在一開始的時候代碼都是非常規(guī)整柱查,結構清晰明了的,但是隨著項目的不斷迭代虐急,需求不斷的增加,團隊逐漸壯大后滔迈,慢慢我們的項目就開始出了問題止吁,長期下來就會造成我們不愿意面對的“屎山代碼”,所以制定一套代碼分析系統(tǒng)是十分必要的燎悍。
xcodebuild
這個無需特意安裝敬惦,只要電腦中有Xcode就會自帶xcodebuild,使用命令行編譯項目并不是什么難事谈山,現(xiàn)在幾乎所有的公司都采用腳本進行打包操作俄删,如果我們要進行靜態(tài)代碼分析就更加的簡單,只需要保證編譯過程即可奏路,OCLint的原理就是通過分析我們app的build日志來進行規(guī)范性檢查畴椰,無需像打包一樣考慮后續(xù)的步驟。
平時我們編寫代碼后編譯運行都要選擇對應的scheme思劳,使用命令行編譯代碼也一樣迅矛,cd
到工程目錄下,我們可以通過xcodebuild -list
命令查看工程的target
以及scheme
還有Configurations
潜叛。
imac0823@imac TestDemo % xcodebuild -list
Command line invocation:
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list
User defaults from command line:
IDEPackageSupportUseBuiltinSCM = YES
Information about project "TestDemo":
Targets:
TestDemo
TestDemoQ
Build Configurations:
Debug
DebugPro
Release
ReleasePro
If no build configuration is specified and -scheme is not passed then "Release" is used.
Schemes:
TestDemo
TestDemoQ
在編譯之前最好進行一遍clean
操作秽褒,以防發(fā)生一些意外的錯誤壶硅,這個命令也很常見xcodebuild clean
。
xcodebuild clean
接下來就是選擇對應的workspace
销斟,scheme
以及Configurations
進行構建操作
xcodebuild build -scheme <your_scheme> -workspace <your_workspace>.xcworkspace -configuration Debug
這時你會發(fā)現(xiàn)編譯可能會失敗并報出以下錯誤
note: Building targets in dependency order
/Users/imac0823/Desktop/TestDemo/TestDemo.xcodeproj: error: Provisioning profile "iOS Team Provisioning Profile: com.xxxx.xxxxx" doesn't include the currently selected device "Xxxxx的iMac" (identifier 000000-000000A000D0000E). (in target 'TestDemoQ' from project 'TestDemo')
warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'TestDemoQ' from project 'TestDemo')
** BUILD FAILED **
這是因為我們沒有指定對應的編譯設備導致出現(xiàn)問題庐椒,可以通過xcodebuild -showsdks
查看可選擇的編譯設備
imac0823@iMac TestDemo % xcodebuild -showsdks
DriverKit SDKs:
DriverKit 22.2 -sdk driverkit22.2
iOS SDKs:
iOS 16.2 -sdk iphoneos16.2
iOS Simulator SDKs:
Simulator - iOS 16.2 -sdk iphonesimulator16.2
macOS SDKs:
macOS 13.1 -sdk macosx13.1
macOS 13.1 -sdk macosx13.1
tvOS SDKs:
tvOS 16.1 -sdk appletvos16.1
tvOS Simulator SDKs:
Simulator - tvOS 16.1 -sdk appletvsimulator16.1
watchOS SDKs:
watchOS 9.1 -sdk watchos9.1
watchOS Simulator SDKs:
Simulator - watchOS 9.1 -sdk watchsimulator9.1
直接指定使用iOS SDKs進行編譯即可,編譯前再加上clean
就是完整的編譯命令
xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug -sdk iphoneos16.2
編譯成功
warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'TestDemoQ' from project 'TestDemo')
** BUILD SUCCEEDED **
xcpretty
命令行編譯的過程中我們可以看到控制臺整個日志的打印是非常雜亂無章的蚂踊。
?此處需要插入圖片?
而xcpretty的作用就是格式化我們的build日志约谈,讓整個編譯過程的日志看起來更加的清晰明了。
首先需要通過控制臺進行安裝
gem install xcpretty
如果安裝遇到權限相關問題可以參考我的上一篇文章犁钟,安裝成功之后他的使用也很簡單棱诱,直接在我們編譯命令后面跟上xcpretty
即可
xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug -sdk iphoneos16.2 | xcpretty
使用了xcpretty之后整個打印過程就會清晰明了很多
之前說過OCLint是分析編譯過程的日志來進行規(guī)范化掃描,實際上就是需要使用xcpretty格式化之后的日志涝动,因此我們要輸出格式化之后的報告迈勋。
-r //設置輸出報告的格式,junit醋粟,html靡菇,json-compilation-database,推薦使用json-compilation-database
-o //輸出文件的名稱米愿,必須設置為compile_commands.json厦凤,不然OCLint分析的時候會報錯
?編譯命令要添加COMPILER_INDEX_STORE_ENABLE=NO
,OCLint分析的時候會報oclint: error: one compiler command contains multiple jobs錯誤
完整命令如下:
xcodebuild clean build -scheme TestDemoQ -workspace TestDemo.xcworkspace -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO -sdk iphoneos16.2 | xcpretty -r json-compilation-database -o compile_commands.json
執(zhí)行完命令我們的項目工程目錄中就會生成一個名為compile_commands.json的文件
接下來就可以著手準備OCLint的安裝了育苟。
OCLint
OCLint 是一種靜態(tài)代碼分析工具较鼓,用于通過檢查 C、C++ 和 Objective-C 代碼并查找潛在問題來提高質量并減少缺陷宙搬,靜態(tài)代碼分析是檢測編譯器不可見的缺陷的關鍵技術笨腥。OCLint 通過高級功能自動執(zhí)行此檢查過程:
- 依托源碼的抽象語法樹,準確性和效率更高勇垛;誤報被減少脖母,以避免有用的結果陷入其中。
- 即使在運行時闲孤,也可以將規(guī)則動態(tài)加載到系統(tǒng)中谆级。
- 靈活且可擴展的配置,用戶可自定義檢查規(guī)則讼积。
- 有利于開發(fā)過程中代碼的持續(xù)集成和持續(xù)檢查肥照,盡早修復技術債務,降低維護成本勤众。
以上就是OCLint官網(wǎng)的說明舆绎。可以使用終端來進行OCLint的安裝们颜。
brew install oclint
也可以從GitHub官方鏈接下載安裝吕朵。
可惜現(xiàn)在從官網(wǎng)下載安裝也安裝不到最新的版本了??猎醇,它只支持到Xcode13,但是目前大家用的肯定都是Xcode14以上努溃,如果使用官網(wǎng)版本去運行會報非常多的錯誤硫嘶。因此,14以下的可以官網(wǎng)下載安裝梧税,14以上可以去到這個鏈接進行下載安裝沦疾,一位大神修復了OCLint在Xcode14上的問題。
直接從鏈接把源碼下載下來第队,使用終端cd到oclint-scripts
文件夾下哮塞,執(zhí)行./make
即可,完成后找到以下內(nèi)容斥铺,全部拷貝到你想要存放的路徑中比如/Users/Documents/OCLint
彻桃。
最后配置環(huán)境變量
export PATH="/Users/Documents/OCLint/bin:$PATH"
source ~/.zshrc
輸入oclint --version
,查看是否配置成功
imac@iMac ~ % oclint --version
OCLint (https://oclint.org):
OCLint version 23.0.
Built Sep 21 2023 (16:21:47).
OCLint自帶了72條檢查規(guī)則晾蜘,詳情可以參考官方文檔,使用OCLint檢查代碼的時候會查出來非常多不規(guī)范的內(nèi)容眠屎,因此我們最好把范圍縮小剔交,比如不檢查Pods目錄下的第三方庫,或者系統(tǒng)的Application文件改衩,就可以使用-e
來進行忽略岖常。
-e Pods -e Application
也可以指定輸出報告的格式
-report-type html -o oclintReport.html
完整的指令如下,在compile_commands.json目錄下執(zhí)行葫督,執(zhí)行完畢就會多出一個oclintReport.html文件竭鞍,輸出報告的時間取決于項目的大小。
oclint-json-compilation-database -e Pods -e Applications -- -report-type html -o oclintReport.html
這樣的報告輸出會檢查出來非常多的代碼不規(guī)范橄镜,我們也可以指定哪些規(guī)則不檢測偎快,或者只檢測某些規(guī)則,這些留到下一篇文章去講解洽胶。