1.安装
// 安装OCLint
sudo brew tap oclint/formulae
sudo brew install oclint
// 安装xcpretty
sudo gem install xcpretty
gem install xcpretty报错:
错误:执行gem时(Gem :: FilePermissionError)
重新安装冲泡后在安装xcpretty
brew安装红宝石
确认安装成功
运行oclint确认环境配置正确
1
|
$ oclint
|
如果展示以下内容即为安装成功:
1
|
oclint: Not enough positional command line arguments specified!Must specify
|
2. 更新
// 以后可能需要更新
brew update
brew upgrade oclint
3.使用
Xcode IDE
oclint 可以和 Xcode IDE 结合,把错误直接在 IDE 中显示出来。
首先,我们在项目中创建一个新的 target,然后选择 Aggregate 作为模板。
然后给这个 target 命名,注意我们可以建立多个 target,然后分别关注代码分析的多个方面。
然后在 Build Phases 选项卡中选择 Add Run Script。
关于脚本的编写我们仍然选择最简单的方式,即 xcodebuild + xcpretty + oclint-json-compilation-database 的方式来做 oclint。脚本如下:
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 '-----分析完毕-----'
open oclint_result.html
else echo "-----分析失败-----"; fi
过滤选项
-I包括,-include INCLUDES,-include包括:
-e EXCLUDES,-exclude EXCLUDES,-exclude EXCLUDES:
调试选项
-v:通过这个选项可以输出最终执行的oclint指令。
-debug:开启这个选项会给出更详细的信息。但是同样这个选项只有在OCLint的debug标示开启的时候才有效。
可以通过 -- 的方式在指令的最后加上oclint 选项。
中间可能会在Build Succeeded
后面等待一段时间,这是因为OCLint在分析文件
-----分析完毕-----
字样,
打开项目目录,会看到目录下会多出一个** oclint_result.html **的文件
如果没有使用cocoapods,则去掉myworkspace=haha.xcworkspace
、-workspace $myworkspace
、-workspace $myworkspace
,然后再在终端执行
另外可以自己建一个xx.sh的文件,将上面代码粘贴进去,每次在命令行进入xx.sh所在目录执行bash xx.sh
就可以了
结果查看
双击打开oclint_result.html文件,样式如下
OCLint的分析结果:
优先级的级别的英文从Priority 1, Priority 2, Priority 3
依次降低的Total Files
总文件数Files with Violations
违规文件数Compiler Warnings
表示项目中的警告⚠️ Compiler Errors
表示compile-错误Location
表示警告的位置
报告扩展中的描述其实非常清晰,一般找到代码位置,结合代码理解下,基本自己都能明白了
可以直接复制路径到铬打开查看,右击查看源码就有行号
OCLint有三个指令
OCLint有三个指令:oclint,oclint-json-compilation-database,oclint-xcodebuild。
oclint:常规核心指令。
oclint-json-compilation-database:从编译好的compile_commands.json文件中读取配置信息并执行oclint。
oclint-xcodebuild联编:主要用于生成compile_commands.json文件,现在已经不进行维护了,我们可以用xcpretty替代,来生成JSON文件。
oclint指令
使用语法
1
|
oclint [options] <source> -- [compiler flags]
|
[选项]为一些参数选项,可以是规则加载选项,报告形式选项等:
-R <路径>:检测所用的规则的路径,默认路径$(/ path / to / bin / oclint)/../ lib / oclint / rules
-disable-rule <规则名>:让相对应的规则失效(OCLint规则列表)。
-rc <参数> = <值>:修改阈值
-report-type <报告类型>,有“text”,“html”,“json”,“pmd”,“xcode”几个类型
-o <路径>报告生成路径。
例如:
1
|
oclint -R /path/to/rules -disable-rule ObjCAssignI
var
OutsideAccessors -report-type xcode
|
oclint-json-compilation-database指令
这是我们主要用到的指令,它是oclint指令的升级版,使用起来相对oclint指令简单方便。
可以通过 - 的方式在指令的最后加上oclint选项。
oclint-json-compilation-database指令有过滤文件选项
-i:包含进某些文件
-e:过滤掉某些文件
例如:
1
2
3
4
|
# 排除Pods 里的文件
oclint-json-compilation-database -e Pods
# 包含进Pods里的文件
oclint-json-compilation-database -i Pods
|
oclint-xcodebuild指令。
因为oclint-xcodebuild指令已经不再维护,实际应用中用xcpretty代替,所以这里就不进行介绍。
其他命令工具:xcodebuild和xcpretty
xcodebuild联编
xcodebuild是苹果发布自动构造的工具,可以通过命令行脚本的方式编译,打包Xcode工程。
可以在终端输入man xcodebuild来查询相关用法
自定义规则
上面的命令中-e Pods
表示移除Pods文件夹里代码的分析,如果有继续-e Debug.m
-report-type html
表示分析后输出的文件类型为HTML,查看其他支持的文件类型-o oclint_result.html
表示输出到oclint_result.html
这个文件中()-rc LONG_LINE=200
表示每行最大字节长度为200(默认值为100,感觉在OC中100完全不够用啊)
一些常用规则的注释
# --命名
# 变量名字最长字节
#-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=30 \
# 方法参数
#-rc=TOO_MANY_PARAMETERS=6
oclint JSON的编译数据库命令手册
oclint命令手册
OCLint自定义规则介绍
OCLint规则全部介绍
文档里面有每个规则的演示和对应的命令名字,上面没介绍到的大家可以去文档查询
Warning❗️
(一)。xcodebuild联编命令不好用的时候,使用com + opt + shift + k
状语从句:com + shift + k
有80%的可能解决
(二)。 oclint: error: one compiler command contains multiple jobs:
解决方案:
1.如果电脑里面安装了两个Xcode的话可能会报上面错误,删掉其他只剩一个
xcode9以后(OCLint版本0.13,版本9.2 beta(9C34b)测试可用):
2.1更新到最新的oclint
,brew upgrade oclint
2.2去github下载最新的oclint.sh,替换掉旧的
3.试试手动将工程=> Build Settings
=>搜索COMPILER_INDEX_STORE_ENABLE
该配置设成NO
4.在podfile中添加:
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
在'==='中:US-ASCII中的无效字节序列
此时你需要在Xcode中的脚本的最前面,加上:
# 指定编码
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=
oclint规则索引
http://blog.csdn.net/liqinghuiyx/article/details/52471161
错误说明:https://www.jianshu.com/p/35cf99c07eaa
OCLint 0.10.3包含71条规则。
- 基本基本
- 条件位运算BitwiseOperatorInConditional
- 错误空检查BrokenNullCheck
- 错误无检查BrokenNilCheck
- 特殊判断检查BrokenOddnessCheck
- 可以合并if语句CollapsibleIfStatements
- 恒定条件运算ConstantConditionalOperator
- IF条件恒定ConstantIfExpression
- 无效代码DeadCode
- 双重否定DoubleNegative
- 对于应该转换为ForLoopShouldBeWhileLoop
- Goto语句GotoStatement
- 混乱的增量JumbledIncrementer
- 错位的空检查MisplacedNullCheck
- 错位的无检查MisplacedNilCheck
- 多余运算符MultipleUnaryOperator
- 最后包含Return ReturnFromFinallyBlock
- Finally抛出异常 ThrowExceptionFromFinallyBlock
- Cocoa
- Convention 约定
- 循环最后避免分支 AvoidBranchingStatementAsLastInLoop
- BaseClassDestructorShouldBeVirtualOrProtected
- 全覆盖的Switch不需要默认值CoveredSwitchStatementsDontNeedDefault
- default应该在Witch语句最后 DefaultLabelNotLastInSwitchStatement
- 虚拟类的析构函数 DestructorOfVirtualClass
- 逻辑倒置 InvertedLogic
- Switch语句缺少Break MissingBreakInSwitchStatement
- Switch中非case NonCaseLabelInSwitchStatement
- IvarAssignmentOutsideAccessorsOrInit
- 参数值重置 ParameterReassignment
- 使用短判断 UseEarlyExitsAndContinue
- Switch缺少Default SwitchStatementsShouldHaveDefault
- Switch分支语句太少 TooFewBranchesInSwitchStatement
- Design 设计
- Empty 空
- Migration
- Naming 命名
- Redundant 沉余
- 尺寸大小
- 未使用无用
https://www.jianshu.com/p/3be0a519d6e2