本篇主要讲一下利用SwiftLint对Swift代码进行扫描
如果想对CI的配置以及OCLint扫描有更多了解可以参考:代码静态扫描-OCLint集成到CI流程,这里不再重复对CI配置的说明。
SwiftLint问题类型
SwiftLint规则一共有200多个,其中能和平时开发联系上的,我只使用了1个,就是强制解包。这种类型的问题也是经常导致崩溃的原因,而其他类型大部分主要和代码设计规范或者编码规范相关。
强制解包规则:force_unwrapping
更多具体的规则详情可以参考官方文档:SwiftLint规则
SwiftLint使用
安装
brew install swiftlint
使用
swiftlint lint --reporter html --output result_path files
result_path是扫描结果文件存放的路径,files是扫描文件的文件夹位置
配置SwiftLint规则
可以在项目目录下放置一个.swiftlint.yml作为配置文件来设置SwiftLint扫描参数,下面的配置信息只设置了一个强制解包的规则:
only_rules:
- force_unwrapping
reporter: "html" # reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging, summary)
扫描过程
SwiftLint扫描的时候跟前面介绍OCLint有一些区别:
1.这里没有先编译,SwiftLint的编译和扫描应该是同时进行的。扫描的时候只需要指定Swift代码位置就行了,不需要指定项目工程路径。也就是可以单独对部分文件进行扫描,这点非常方便。如果是OCLint,整个工程编译不过,就没法直接开始扫描的。
2.在扫描过程中没有遇到扫描代码量太大需要分隔的情况,所以这里是直接输入扫描代码文件路径,按路径多次扫描,就能直接获得某个Pod组件的扫描结果。可能跟本身项目中使用的Swift代码少有关系,同时SwiftLint有没有扫描代码量大小限制或者限制具体是多少还不清楚,目前还没有遇到过。
基于上面2点原因,实际上使用SwiftLint扫描项目代码的时候流程会简单很多,但它同样也需要对扫描结果整体进行分类和统计:
配置文件和脚本
globalConfig.py //用来配置项目的相对路径
scan_files.json //用来配置需要扫描的组件代码
swift_scan.py //启动扫描的脚本
swift_summary.py //对所有扫描代码进行统计并生产结果文件的脚本
整体感受上,SwiftLint要清爽很多。特别是可以单独只对部分文件扫描,完全不依赖整个项目是否能够编译通过。如果只对一些提交的代码文件进行扫描就很方便。
欢迎关注我的公众号
包含更多内容,最新文章第一时间发布在公众号