第1步:安装 oclint
brew install oclint
第2步:构建 Xcode 工程
用命令行工具 xcodebuild
命令格式为 xcodebuild [options]
由于需要将输出的日志保存起来,所以需要运行如下命令:
xcodebuild [options] | tee xcodebuild.log
完整例子:Xcode 工程名为 OCLintDemo,构建命令如下:
xcodebuild build -scheme OCLintDemo | tee xcodebuild.log
日志会在终端中输出,同时会保存到 xcodebuild.log 文件中。
第3步:格式化日志
用 OCLint 的 oclint-xcodebuild
命令将第2步的日志文件 xcodebuild.log 格式化为 JSON 格式的文件, 运行 oclint-xcodebuild
后自动创建 compile_commands.json 文件。
NOTE:由于 oclint-xcodebuild
已经不再维护,推荐使用 xcpretty 程序,安装方式:
gem install xcpretty
这个后面再详说。
第4步:分析日志
这一步也即是分析代码。
运行 oclint-json-compilation-database
命令,即会输出分析的结果。包含的信息有不符合规范的个数、在文件中的位置,规范的类别等等。默认是在终端中输出,也可以指定参数按特定格式输出到文件中,如生成 HTML 文件:
oclint-json-compilation-database -- -report-type=html -o result.html
报告内容长这样:
其他
规则文件目录
/usr/local/Cellar/oclint/0.13/lib/oclint/rules
这个目录下是一些.dylib文件,oclint 就是基于这些文件对代码进行规则检查的。如 libLongLineRule.dylib
,是单行字符数限制规则。
以上步骤可以写到一个 shell 脚本文件中,在 Xcode 工程根目录中执行脚本就可以自动生成报告。脚本代码如下(工程名为 OCLintTest):
#/usr/bin/bash
# 先清除缓存
echo 'CLEANING DERIVED DATA...'
xcodebuild clean -scheme OCLintTest
# 第1步,构建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
设置系统提供的规则阈值方法如下:
-rc <threshold_name>=<new_value>
-rc CYCLOMATIC_COMPLEXITY = 15 -rc LONG_LINE = 50```
系统提供的规则,可以设定阈值的如下:
名称 描述 默认阈值
CYCLOMATIC_COMPLEXITY 方法的循环复杂性(圈负责度) 10
LONG_CLASS C类或Objective-C接口,类别,协议和实现的行数 1000
LONG_LINE 一行代码的字符数 100
LONG_METHOD 方法或函数的行数 50
LONG_VARIABLE_NAME 变量名称的字符数 20
MAXIMUM_IF_LENGTH if希块的行数 15
MINIMUM_CASES_IN_SWITCH switch语句中的case数 3
NPATH_COMPLEXITY 方法的NPath复杂性 200
NCSS_METHOD 一个没有注释的方法语句数 30
NESTED_BLOCK_DEPTH 块或复合语句的深度 5
SHORT_VARIABLE_NAME 变量名称的字符数 3
TOO_MANY_FIELDS 类的字段数 20
TOO_MANY_METHODS 类的方法数 30
TOO_MANY_PARAMETERS 方法的参数数 10