OCLint CodeReview静态代码分析
前言
OCLint 是一个静态分析代码的工具,支持自定义规则,可以很好地帮助我们规范代码,提高代码质量,是团队开发CodeReview一大利器,本文主要通过OCLint让XCode来Code Review,网上的资料挺多的,(但还是有些坑)记录下方便自己以后越坑.
OCLint相关的详细内容也可以到OCLint官网上查看。
安装OCLint 和 xcpretty
- 安装xcpretty
用gem安装xcpretty
sudo gem install xcpretty
用sudo是防止一些权限出现问题
安装OCLint
1)通过安装包:
从oclint的github项目链接下载安装
OCLINT_HOME=/pathexport PATH=$PATH:OCLINT_HOME/bin
然后source .bashrc即可
2)通过Homebrew
brew tap oclint/formulae
brew install oclint
3)确认安装成功
运行oclint确认环境配置正确
$ oclint
如果展示以下内容即为安装成功:
oclint: Not enough positional command line arguments specified!Must specify at least 1 positional arguments: See: oclint -help
4)oclint的版本
oclint --version
which oclint
oclint存放位置
OCLint 三个指令
1)oclint常规核心指令
oclint [options] <source> -- [compiler flags]
[options]为一些参数选项,可以是规则加载选项、报告形式选项等:
- -R <路径> : 检测所用的规则的路径,默认路径$(/path/to/bin/oclint)/../lib/oclint/rules
- -disable-rule <规则名>: 让相对应的规则失效(OCLint 规则列表)。
- -rc <参数>=<值> :修改阈值
- -report-type <报告类型>,有"text"、“html”、“json”、“pmd”、“xcode”几个类型
- -o <路径> 报告生成路径.
egoclint -R /path/to/rules -disable-rule ObjCAssignIvarOutsideAccessors -report-type xcode
2)oclint-json-compilation-database
从编译好的compile_commands.json 文件中读取配置信息并执行 oclint。
主要用于生成compile_commands.json文件,现在已经不进行维护了,我们可以用xcpretty替代,来生成json文件.
oclint-json-compilation-database 指令
这是我们主要用到的指令,它是oclint 指令的升级版,使用起来相对 oclint 指令简单方便。可以通过 -- 的方式在指令的最后加上oclint 选项。
oclint-json-compilation-database 指令有过滤文件选项
-i :包含进某些文件
oclint-json-compilation-database -i Pods
-e : 过滤掉某些文件
oclint-json-compilation-database -e Pods
3)oclint-xcodebuild 指令
oclint-xcodebuild 指令不再维护,实际应用中用xcpretty代替.
OCLint使用
1)新建工程AddTest添加Aggregate
075F858D-C8F3-4B97-BF59-FC8C8DA95925.png
2)选择Aggregate
2ACF7D44-CF28-4F6D-BDD2-86416762945D.png
3)点击next输入ProductName
图片.png
4)建立运行脚本
C480D7AC-D0E5-48BB-BB1B-790EC8E3C670.png
5)配置运行脚本
CA419EC0-8487-4F3D-9102-3674258695EC.png
6)运行结果
87EE9D72-60DB-4A33-B39E-02067599AA53.png
***注意点 ***
1.在根目录下新建文件oclint,然后进入oclint文件夹,touch oclint.sh
2.sh脚本不对,路径不对都很容易gg,有些运行成功但是不报警告,需要检查下路径.
3 oclint.sh脚本
export LANG="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_ALL=
function checkDepend () {
command -v xcpretty >/dev/null 2>&1 || {
echo >&2 "I require xcpretty but it's not installed. Install:gem install xcpretty";
exit
}
command -v oclint-json-compilation-database >/dev/null 2>&1 || {
echo >&2 "I require oclint-json-compilation-database but it's not installed. Install:brew install oclint";
exit
}
}
function oclintForProject () {
# 检测依赖
checkDepend
projectName=$1
scheme=$2
reportType=$3
REPORT_PMD="pmd"
REPORT_XCODE="xcode"
myworkspace=${projectName}
myscheme=${scheme}
echo "myworkspace是:${myworkspace}"
echo "myscheme是:${myscheme}"
echo "reportType为:${reportType}"
# 清除上次编译数据
if [ -d ./build/derivedData ]; then
echo '-----清除上次编译数据derivedData-----'
rm -rf ./build/derivedData
fi
# xcodebuild -workspace $myworkspace -scheme $myscheme clean
xcodebuild clean
echo '-----开始编译-----'
# 生成编译数据
xcodebuild -workspace ${myworkspace} -scheme ${myscheme} -sdk iphonesimulator -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json
if [ -f ./compile_commands.json ]
then
echo '-----编译数据生成完毕-----'
else
echo "-----生成编译数据失败-----"
return -1
fi
echo '-----分析中-----'
# 自定义排除警告的目录,将目录字符串加到数组里面
# 转化为:-e Debug.m -e Port.m -e Test
exclude_files=("cardloan_js" "Pods")
exclude=""
for i in ${exclude_files[@]}; do
exclude=${exclude}"-e "${i}" "
done
echo "排除目录:${exclude}"
# 分析reportType
if [[ ${reportType} =~ ${REPORT_PMD} ]]
then
nowReportType="-report-type pmd -o pmd.xml"
else
nowReportType="-report-type xcode"
fi
# 自定义report 如:
# nowReportType="-report-type html -o oclint_result.html"
# 生成报表
oclint-json-compilation-database ${exclude} -- \
${nowReportType} \
-rc LONG_LINE=200 \
# --命名
# 变量名字最长字节
-rc=LONG_VARIABLE_NAME=20 \
# 变量名字最短字节
-disable-rule ShortVariableName \
# --size # 圈复杂度 #
-re=CYCLOMATIC_COMPLEXITY=10 \
# 每个类最行数 #
-rc=LONG_CLASS=700 \
# 每行字节数量 #
-rc=LONG_LINE=200 \
# 每个方法行数 #
-rc=LONG_METHOD=80 \
# 忽略注释后括号后的有效代码行数 #
-rc=NCSS_METHOD=40 \
# 嵌套深度 #
-rc=NESTED_BLOCK_DEPTH=5 \
# 字段数量 #
-rc=TOO_MANY_FIELDS=20 \
# 方法数量 #
-rc=TOO_MANY_METHODS=50 \
# 方法参数 #
-rc=TOO_MANY_PARAMETERS=6
-disable-rule ShortVariableName \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule AssignIvarOutsideAccessors \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000
rm compile_commands.json
if [[ ${reportType} =~ ${REPORT_PMD} ]] && [ ! -f ./pmd.xml ]
then
echo "-----分析失败-----"
return -1
else
echo '-----分析完毕-----'
return 0
fi
}
# 替换workspace的名字
myworkspace="AddTest.xcworkspace"
# 替换scheme的名字
myscheme="AddTest"
# 输出方式 xcode/pmd
reportType="xcode"
oclintForProject ${myworkspace} ${myscheme} ${reportType}
下面是几个参考链接,我获益良多,建议深入阅读,尤其是里面的例子…
http://oriochan.com/codeReview01.html
http://www.cocoachina.com/ios/20170928/20669.html