LipYoung / programing-blog

个人中文编程博客。
MIT License
3 stars 0 forks source link

使用 SwiftLint 检查代码风格 #3

Open LipYoung opened 6 years ago

LipYoung commented 6 years ago

在计算机科学中,lint是一种工具程序的名称,它用来标记源代码中,某些可疑的、不具结构性(可能造成bug)的段落。它是一种静态进程分析工具,最早适用于C语言,在UNIX平台上开发出来。后来它成为通用术语,可用于描述在任何一种电脑编程语言中,用来标记源代码中有疑义段落的工具。

摘自中文百科

介绍

realm

SwiftLint是一个用于强制检查 Swift 代码风格和规定的一个工具.由realm维护.

SwiftLint的特点是可以通过[ATS]()的方式展示代码检查的结果,换句话说,就是可以在安装了SwiftLintXcode上每次构建程序(commend + B),不符合检查器要求的部分就会和Xcode自带的错误警告使用一套相同的UI出现提示错误.

最终效果图:

checkstatus

SwiftLint的另外一大特点是可以自己定制检查规则.

ps: 目前该社区只实现了部分规则,社区希望大家能一起帮忙维护更多规则为社区做出贡献.有想法的童鞋点击该链接查看具体的提交说明,为开源社区回馈一份力量.

安装

官方提供了三种安装方式:

  1. 使用 Homebrew
  2. 到最新地址下载官方打包好的SwiftLint.pkg,双击安装
  3. Clone整个仓库到本地,然后执行编译指令,编译本地源码生成安装包.

如果大家有自己更深度的代码规范定制需求,建议使用第三种.SwiftLint使用Swift代码编写,学习门槛不算太大,相关的开发文档都以英文为主.

这里我们使用第二种方式,到开源库下载最新版本的安装包.下载地址

双击打开安装包,使用安装器,傻瓜式安装即可.(自动安装时,需要避免本机同时拥有两个Xcode的情况,会导致异常,同时建议安装到Xcode 8.0以上版本)

安装完毕后,打开Xcode,在 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

runscript

这样就将SwiftLint整合到Xcode上,从而可以使警告和错误显示到Xcode上.

使用

每次构建工程(commend + B)即可.

配置规则

当你在一个旧的工程中初次安装使用SwiftLint时,不出意外编辑器会提示999+左右的警告和错误.大部分原因是因为检查了三方库的源码.

所有首先配置需要哪些是需要检查的源码.

配置文件夹

步奏1: 在工程的根目录下建议一个.swiftlint.yml文件. 步奏2: 在文件内写入规则.

included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
  - Source
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。

步奏3: 添加我们需要检查的文件夹,添加需要忽略的文件.

included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
  - Thinksns Plus/
  - Thinksns PlusTests/
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

这个示例指的是,需要检查工程(Thinksns Plus/)下的相关文件的源码,同时检查(Thinksns PlusTests/)测试文件夹下的测试用例的源码.忽略(Carthage/)忽略(Pods/)这些三方库的源码.

这样再次运行(commend + B),警告和错误都少了很多,而且都是本工程相关的错误.

但是这些错误是根据官方GitHub's Swift guide规则进行检查,不符合的地方报错.但是该代码指南不一定符合我们实际的需求,所以需要制定自己的检查规则.

配置检查规则

在配置检查规则之前,你需要一份自己的代码风格指南.

开始动手之前也需要熟读官方的配置文件语法.基本上都比较简单,看一次即可.接下来举几个我编写检查规则时遇到的问题.

开关规则

disabled_rules: # 执行时排除掉的规则
- colon

disabled_rules这条规则顾名思义,检查时,某些规则不进行检查.colon这条规则指的是,如果你在编写了变量后必须紧跟上冒号.这样写之后,检查器会忽略掉该条规则.

你可以在终端中执行swiftlint rules来查看目前官方自带的所有规则名称和含义.

官方代码规则说明表

+-----------------------------------------+--------+-------------+------------------------+-----------------------------------------------------------------------------------------------------+
| identifier                              | opt-in | correctable | enabled in your config | configuration                                                                                       |
+-----------------------------------------+--------+-------------+------------------------+-----------------------------------------------------------------------------------------------------+
| attributes                              | yes    | no          | no                     | warning, always_on_same_line: ["@IBAction", "@NSManaged"], always_on_line_above: []                 |
| closing_brace                           | no     | yes         | yes                    | warning                                                                                             |
| closure_end_indentation                 | yes    | no          | no                     | warning                                                                                             |
| closure_parameter_position              | no     | no          | yes                    | warning                                                                                             |
| closure_spacing                         | yes    | no          | no                     | warning                                                                                             |
| colon                                   | no     | yes         | yes                    | warning, flexible_right_spacing: false, apply_to_dictionaries: true                                 |
| comma                                   | no     | yes         | yes                    | warning                                                                                             |

那么如果在实际的开发过程中,你只是需要对某个文件内不执行colon该如何配置?

你只需要在该代码的源文件中添加一条如下格式的注释即可:

// swiftlint:disable colon

这样在该文件内,所有的代码都不会被colon规则检查.

官方还提供了previous this 和 next .他们可以用来使关闭或者打开某条规则的命令分别应用于前一行,当前或者后一行代码

定制规则内容

有些规则在开启的情况下,还需要配置更多的参数.例如file_length规则,他会检查每个文件的代码行数.安装下面的代码配置警告和错误.

file_length:
  warning: 500
  error: 1200
# 命名规则可以设置最小长度和最大程度的警告/错误
# 此外它们也可以设置排除在外的名字

当文件代码行数超过 500 时警告.超过 1200 时错误,无法正常编辑工程.

自定义规则

官方还提供了自定义规则的方法,基于正则表达式

custom_rules:
  pirates_beat_ninjas: # 规则标识符
    name: "Pirates Beat Ninjas" # 规则名称,可选
    regex: "([n,N]inja)" # 匹配的模式
    match_kinds: # 需要匹配的语法类型,可选
      - comment
      - identifier
    message: "Pirates are better than ninjas." # 提示信息,可选
    severity: error # 提示的级别,可选
  no_hiding_in_strings:
    regex: "([n,N]inja)"
    match_kinds: string

更多规则

相关的规则还会嵌套,和相关影响.更多的细节查看官方文档即可,不在赘述.

自动修正

在确定源码被正常备份后使用swiftlint autocorrect指令可以对源代码进行自动修正.

请慎重操作!

资料来源

更多的关于SwiftLint的详细介绍可以查看这篇官方中文说明

GitHub's Swift 代码风格指南可以点击该链接

LipYoung commented 6 years ago

2017-01-23的一篇博客,顺利搬迁🎉