静态代码分析

在 Dart 开发中,静态代码分析(Static Analysis)是成本最低、收益最高的质量保障手段,它用于在代码运行之前,消灭绝大部分低级错误。

分析工具

命令 dart analyze 是Dart SDK自带的利器,它通过解析抽象语法树(AST)来发现潜在问题 —— 类型不匹配、未使用的变量、可能的空指针异常、不规范的命名等。使用方法是在 Project 根目录下执行该命令即可。

配置文件

dart analyze 使用 analysis_options.yaml 作为其配置文件,该文件定义了Lint规则。文件文件内容示例如下:

include: package:lints/recommended.yaml # 引入官方推荐规则

analyzer:
  exclude:
    - "lib/generated/**" # 排除生成的代码
  errors:
    todo: ignore       # 将 TODO 标记为忽略
    unused_local_variable: error # 将未使用的变量直接升级为 Error,强制清理

linter:
  rules:
    - always_declare_return_types  # 强制声明返回类型
    - prefer_single_quotes         # 统一使用单引号
    - annotate_overrides           # 强制使用 @override
    - avoid_print                  # 生产代码禁止 print

Lint规则

现有的Lint规则

Dart 官网列出的规则集及规则: https://dart.dev/tools/linter-rules

  • Core 规则集 (package:lints/core.yaml): 极其基础的规则,几乎所有项目都应遵守。
  • Recommended 规则集 (package:lints/recommended.yaml): 包含 Core,并增加了提高可读性和避免常见坑点的规则(Dart 团队推荐)。
  • Flutter 规则集(package:flutter_lints/flutter.yaml): 专门为 Flutter 优化的系列规则。

自定义 Lint 规则

如果官方规则不够用,我们可以使用 custom_lint 自定义 Lint 规则。

自动化实践:Git Hooks

通过使用 pre-commithusky (基于 Node.js 生态) 工具,可以要求只有分析通过的代码才能被提交。

下面演示 pre-commit的用法。

a. 安装 pre-commit:

pip install pre-commit

b. 配置

touch .pre-commit-config.yaml

其文件内容示例如下:

repos:
  - repo: local
    hooks:
      - id: dart-format
        name: Dart Format
        entry: dart format
        language: system
        types: [dart]
      - id: dart-analyze
        name: Dart Analyze
        entry: dart analyze
        language: system
        types: [dart]

c. 激活

pre-commit install

现在随便向repo提交点什么,我们会发现 pre-commit 已经生效了。

$ git commit -m "Static Analysis"
Dart Format..........................................(no files to check)Skipped
Dart Analyze.........................................(no files to check)Skipped
[main 072e14f] Static Analysis
 1 file changed, 1 insertion(+)

Reference