如今代码质量在中国的大环境不那么被重视,搞得我都曾经怀疑过自己的价值观^_^。可以对代码质量视而不见的理由太多了,譬如没时间,或是觉得对KPI没啥贡献之类的。如果你这么想了,你或许永远都数不清糟糕的代码风格给你和你的TEAM带来多少麻烦。
我们需要一个自动化的工具监控并改善代码质量,OCLint就是我们想要的,支持Objective-C/C/C++语言。小试牛刀一把,在此分享自己的经验。
官方文档提供了三种安装方式:
- 添加到系统PATH
- 使用HomeBrew
- 直接拷贝文件到系统路径
我试过第一种,会报“找不到任何规则”的错误,不太推荐。HomeBrew安装可能走一半就失败,不想折腾的话就直接拷文件吧(也可以建立软链接)。我直接贴出官方文档的命令:
cp bin/oclint* /usr/local/bin/cp -rp lib/* /usr/local/lib/cp -rp include/* /usr/local/include/
现在,我们需要一个配置文件来指定OCLint的规则和输出格式。最简单的方式是在你的项目根目录下新建一个.oclint文件,这样你的配置只会作用于自己的项目。OCLint的配置是基于YAML的,不熟悉请移步度娘。
小提示:
- 注意缩进,否则会报错。
- 字符串可以用单引号包括起来,当你的字符中含有“-”等特殊符号时,这是必须的。
贴出我的配置文件:
disable-rules:- LongLinerule-configurations:- key: CYCLOMATIC_COMPLEXITY value: 15- key: NPATH_COMPLEXITY value: 300output: output.htmlreport-type: htmlmax-priority-1: 20max-priority-2: 40max-priority-3: 60enable-clang-static-analyzer: true
oclint
命令需要传递clang编译参数。我们使用xcodebuild
来编译项目,其实会向clang传递数量庞大的编译参数,不可能手动传递。虽然使用oclint时编译项目不是必须的,但我们需要通过xcodebuild
命令配合xcpretty
/xctool
在编译时输出参数到json文件,然后使用oclint-json-compilation-database
命令读取json参数并生成报告。
我尝试了xctool
,会报错,可能因为它不兼容新版xcode?于是我使用xcpretty
代替:
xcodebuild \ -workspace test.xcworkspace \ -scheme test \ -configuration DEBUG \ clean build | \ xcpretty -r json-compilation-database -o compile_commands.jsonoclint-json-compilation-database
执行完毕后,检查一下compile_commands.json文件中是否有json内容输出?在项目目录中就可以找到output.html了。用浏览器打开看一看,是不是很漂亮~
report-type还可以指定为xml、text、xcode等,可以动手试一试。
PS:之前趟过一个坑,clean
和build
要写在一行。如果分为两行写(官方的教程就是如此),比如这样:
xcodebuild cleanxcodebuild build
在终端执行似乎没问题,在XCode中以编译脚本的方式执行会发现输出内容比较少(也许和XCode版本有关系),compile_commands.json中内容是空的。后续oclint-json-compilation-database
命令会缺少参数报错。纠结了很久,大家引以为戒~
OCLint还支持集成到XCode,这样我们就可以在编辑器里以warning的形式查看OCLint的建议,比较直观。
建立一个Aggregate目标:
然后在Build Phases中新建一段脚本:
xcodebuild -workspace test.xcworkspace -scheme test -configuration DEBUG clean build | \xcpretty -r json-compilation-database -o compile_commands.jsonoclint-json-compilation-database -- -report-type=xcode -o '-'
oclint-json-compilation-database
命令支持带oclint
参数(参考oclint -help),跟在--后面。我们可以在这里覆盖.oclint配置中的内容。这里我们覆盖了两个配置:
- 指定输出类型为xcode。
- 指定输出文件名为-,意思是输出到stdout,否则会看不到提示。
然后我们运行项目,大功告成~