开发过程中有两个难点,一是M1电脑配置SwiftLint的命令,二是如何添加自定义rule,问题二中英文的资料都特别少,完全是根据官方pull requests文档,以及OClint的接入经验一点一点试出来的。
说明
- SwiftLint有Homebrew和CocoaPods两种接入方式
- 因为存在自定义代码规范,所以只介绍通过Homebrew接入
安装使用 Homebrew:
brew install swiftlint
用法
整合 SwiftLint 到 Xcode 体系中去从而可以使警告和错误显示到 IDE 上,只需要在 Xcode 中添加一个新的“Run Script Phase”并且包含如下代码即可:
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
如果是M1处理器,命令如下:
alias swiftlint="/opt/homebrew/bin/swiftlint"
if swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
添加自定义规范
- 如何开发自定义规范相关资料很少,只能多参考其他的规范,依葫芦画瓢。
- 下载SwiftLint源码,
git clone https://github.com/realm/SwiftLint.git
- 进入源码所在文件夹
cd SwiftLint
- 执行
xed .
构建工程(这里会进行依赖库的下载,当时开了梯子,一直失败,后面把梯子关了就下载成功了。)
- 选择swiftlint的
Edit Scheme
- 设置
Arguments
和Options
(要扫描文件的路径) - command + b 执行完成后就会有扫描日志
- 新增自定义规范需创建在
/Source/SwiftLintFramework/Rules
路径下 - 创建新的Rule文件后,在
PrimaryRulelist.swift
中添加新rule声明 - SwiftLint要求新Rule必须继承
ASTRule
或Rule
- 如果需要支持通过
.swiftlint.yml
动态传递参数,需继承ConfigurationProviderRule
替换本地SwiftLint执行文件
- 通过Homebrew安装的SwiftLint可执行文件存放在
/opt/homebrew/Cellar/swiftlint/0.49.1/bin/swiftlint
这个路径下 - 而通过源码编译的SwiftLint文件路径,可以在编译日志中查看
- 在这个路径下,可以找到SwiftLint可执行文件
- 将该可执行文件,替换Homebrew安装的SwiftLint可执行文件即可
- 通过命令
swiftlint rules
可以查看现有rule,如果其中有我们新增的rule,说明替换成功了。 - 最后进入要检测的工程中,执行
swiftlint lint --reporter html > swiftlint.html
,即可生成一份html格式的检测报告。
.swiftlint.yml配置文件说明
- 该文件应存放在要检测的工程目录中,是检测所需的配置文件,其中包含需要执行,禁止执行,rule参数等内容。
# 执行时排除掉的规则
disabled_rules:
# 函数体长度检测
- function_body_length
# 对象移除通知只能在deinit移除self,函数中不能removeObserver(self)
- notification_center_detachment
# 一些规则仅仅是可选的
opt_in_rules:
# 所有属性和方法的声明, 都应该明确指定修饰关键字
# - explicit_acl
# 声明的属性应该明确其类型
# - explicit_type_interface
# 可以通过执行如下指令来查找所有可用的规则:
# swiftlint rules
included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
- swiftTest
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
- Pods
# 可配置的规则可以通过这个配置文件来自定义
RuleConfiguration
## 函数体长度
function_body_length:
warning: 10
error: 100
## 命名规则可以设置最小长度和最大程度的警告/错误
type_name:
min_length: 4 # 只是警告
max_length: # 警告和错误
warning: 40
error: 50
excluded: iPhone # 排除某个名字
## 变量标识符名称应该只包含字母数字字符,并以小写字母开头或只应包含大写字母
identifier_name:
min_length: # 只有最小长度
error: 5 # 只有错误
excluded: # 排除某些名字
- id
- URL
- GlobalAPIKey
reporter: "html" # 报告类型 (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging)
最后
- 如果业务需要检测自己的代码规范,我们只需要把我们生成的
swiftlint可执行文件
以及.swiftlint.yml
配置文件交给对方。对方替换本地Homebrew内的swiftlint,然后将.swiftlint.yml
放在工程目录下,即可检测了。
参考资料
基础理论
- 使用 SwiftLint 进行 Swift 代码规范检查 - 掘金
- 用 SwiftLint 保持 Swift 风格一致_51CTO博客_Swiftlint
- 如何通过静态分析提高iOS代码质量 - 腾讯云开发者社区-腾讯云
已有代码规范说明
- SwiftLint代码规范属性说明(一) - 掘金
- SwiftLint代码规范属性说明(二) - 掘金
- SwiftLint代码规范属性说明(三) - 掘金
- SwiftLint 规则收录 | kysonyangs
原理相关
其他问题