静态代码分析
在 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-commit 或 husky (基于 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(+)