技术选型
Infer vs SwiftLint:有什么区别?
什么是 Infer?
Facebook 可以在发布 Android 和 iOS 应用程序之前检测错误的工具。 Facebook Infer 是一个静态分析工具,如果您为 Infer 提供一些 Objective-C,Java 或 C 代码,它将产生一系列潜在的错误。任何人都可以使用 Infer 拦截重大错误,然后再将其发布到人们的手机中,并帮助防止崩溃或性能下降。(访问:fbinfer.com)
Infer 效率高,支持增量分析,可小范围分析,但是可定制性不算最强,不支持 Swift。
什么是 SwiftLint?
实施 Swift 样式和约定的工具。它是一个基于 GitHub 的 Swift Style Guide 松散地实施 Swift 样式和约定的工具,它与 Clang 和 SourceKit 挂钩,可以使用源文件的 AST 表示获得更准确的结果。(访问:github.com/realm/Swift…)
SwiftLint 使用简单,与 Xcode 紧密结合,更适用于包含 ObjC 和 Swift 代码的大型混合项目中。
使用场景
熟悉 Python 的同学一定对 Pylint 不会陌生,Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码。
Python 是一门很强调格式的语言,毕竟人家连大括号都没有,反观 Swift,似乎不按照严格的规范编码也没有太大的问题?错!写出良好代码风格的代码,可能比能否写出高效的代码更为重要。于是,SwiftLint 就诞生了。
SwiftLint 是一个强制使用者按照 Github 的 Swift 编码规范指南来开发的一种工具,它会将所有不符合 Swift 规范的代码全部用 warning 标注出来,一些严重的违背规则的代码甚至让它无法通过编译(江山一片红),想想是不是就很刺激呢?
CodeReview 一般做这样几件事情:
- 代码风格规范统一
- 防止低效代码、冗余代码
- 防止出现可见的明显BUG
第一点,实在属于机械操作,就好像第一次工业革命的人工织布,是处在必然被淘汰的行列。 第二、三点富含了大量人脑的思考,属于暂时还无法替代的操作(AI时代应该可以)。
常用安装
版本要求
SwiftLint 工作于 SourceKit 这一层,所以 Swift 版本发生变化时它也能继续工作! 这也是 SwiftLint 轻量化的原因,因为它不需要一个完整的 Swift 编译器,它只是与已经安装在你的电脑上的官方编译器进行通信。
Swift 版本 | 最后一个 SwiftLint 支持版本 |
Swift 1.x | SwiftLint 0.1.2 |
Swift 2.x | SwiftLint 0.18.1 |
Swift 3.x | SwiftLint 0.25.1 |
Swift 4.0-4.1.x | SwiftLint 0.28.2 |
Swift 4.2.x | SwiftLint 0.35.0 |
Swift 5.x | 最新的 |
(1) 全局安装
全局安装就不得不提到我们的老朋友HomeBrew了,如果你没有安装,那么请看这里。 全局安装非常简单,首先我们需要通过 brew
命令安装 SwiftLint
:
brew install swiftlint
然后添加编译脚本:
# Swiftlint if which swiftlint >/dev/null; then swiftlint else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi
最后在脚本框中添加后:
OK,大功告成,就可以编译啦
(2) 局部安装
除了全局安装,我们也可以通过CocoaPods进行安装。在Podfile上添加相关的依赖:
pod 'SwiftLint'
然后跟全局方法一样,在 Run Script
中添加命令,但是内容有些许的不同:
# Swiftlint Pods "${PODS_ROOT}/SwiftLint/swiftlint"
OK,接下来就让我们来试试看SwiftLint吧!
(3) fastlane 安装
你可以用fastlane官方的SwiftLint功能来运行SwiftLint作为你的Fastlane程序的一部分
swiftlint( mode: :lint, # SwiftLint模式: :lint (默认) 或者 :autocorrect executable: "Pods/SwiftLint/swiftlint", # SwiftLint的程序路径 (可选的). 对于用CocoaPods集成SwiftLint时很重要 path: "/path/to/lint", # 特殊的检查路径 (可选的) output_file: "swiftlint.result.json", # 检查结果输出路径 (可选的) reporter: "json", # 输出格式 (可选的) config_file: ".swiftlint-ci.yml", # 配置文件的路径 (可选的) files: [ # 指定检查文件列表 (可选的) "AppDelegate.swift", "path/to/project/Model.swift" ], ignore_exit_status: true, # 允许fastlane可以继续执行甚至是Swiftlint返回一个非0的退出状态(默认值: false) quiet: true, # 不输出像‘Linting’和‘Done Linting’的状态日志 (默认值: false) strict: true # 发现警告时报错? (默认值: false) )
官方还介绍 Mint 等安装方法,用得到自己去看吧~
使用方法
命令行
$ swiftlint help Available commands: autocorrect Automatically correct warnings and errors help Display general or command-specific help lint Print lint warnings and errors for the Swift files in the current directory (default command) rules Display the list of rules and their identifiers version Display the current version of SwiftLint
项目集成
在给项目初次接入SwiftLint的时候,你可能会被下面这样的情景给吓到:
但是呢,不用慌,我们可以看一下这是什么情况。仔细观察一番之后,我们会发现,绝大多数的Warning都是这个原因:
WTF?我这一行哪里有空格符?简直就是冤枉啊!但其实是这样的,虽然看起来好像没有空格符,但是在换行符之间不应该掺杂制表符,也就是说你实际的代码是这样的:
\n \tab \n
所以呢,人家的Warning也不是没有道理的嘛。那么我们该怎么来消除这些Warning呢? 首先,我们要确保,以后我们所码的代码不再出现这样的格式,所以我们需要把 Text Editing
里面的 Including whitespace-only lines
勾选上:
这样可以保证我们今后的换行不再出现制表符的警告,然后,我们就需要处理现有的代码。现有的代码,少说也有几万行,手动改不是要累死人?这个时候就轮到 SwiftLint 的命令行出场了。
我们将目录切换到工程的根目录之下,然后敲击如下命令:
swiftlint autocorrect
然后我们就会发现,所有的空格符Warning都消失了。这都得益于我们刚刚所进行的命令行操作,它会将已知的能够自动修复的Error和Warning都自动修复,大大的减轻了我们的工作量。