SwiftLint接入及自定义规则开发总结

3,640 阅读4分钟

开发过程中有两个难点,一是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

添加自定义规范

  • 如何开发自定义规范相关资料很少,只能多参考其他的规范,依葫芦画瓢。
  1. 下载SwiftLint源码,git clone https://github.com/realm/SwiftLint.git
  2. 进入源码所在文件夹cd SwiftLint
  3. 执行xed .构建工程(这里会进行依赖库的下载,当时开了梯子,一直失败,后面把梯子关了就下载成功了。)
  1. 选择swiftlint的Edit Scheme
  2. 设置ArgumentsOptions(要扫描文件的路径) 截屏2022-10-21 17.57.23.png
  3. command + b 执行完成后就会有扫描日志
  4. 新增自定义规范需创建在/Source/SwiftLintFramework/Rules路径下
  5. 创建新的Rule文件后,在PrimaryRulelist.swift中添加新rule声明
  6. SwiftLint要求新Rule必须继承ASTRuleRule
  7. 如果需要支持通过.swiftlint.yml动态传递参数,需继承ConfigurationProviderRule

替换本地SwiftLint执行文件

  • 通过Homebrew安装的SwiftLint可执行文件存放在/opt/homebrew/Cellar/swiftlint/0.49.1/bin/swiftlint这个路径下
  • 而通过源码编译的SwiftLint文件路径,可以在编译日志中查看 image.png
  • 在这个路径下,可以找到SwiftLint可执行文件 image.png
  • 将该可执行文件,替换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放在工程目录下,即可检测了。

参考资料

基础理论

已有代码规范说明

原理相关

其他问题