如何逐步将代码库迁移至strict mode(严格模式)
逐步迁移到Dart Strict Mode的方案
核心思路:分阶段管控代码规则
不用单独维护两个analyzer配置文件,Dart的analyzer本身支持基于文件路径的规则覆盖,可以在同一个analysis_options.yaml里实现“旧代码宽松、新/修改代码严格”的效果。
具体步骤
1. 基础配置:全局启用宽松规则
先在根目录的analysis_options.yaml里设置基础的、旧代码能兼容的规则,避免一开始就爆大量错误:
analyzer: strong-mode: implicit-casts: true # 先保留隐式转换,后续逐步关闭 implicit-dynamic: true errors: # 暂时忽略旧代码里常见的严重错误,后续逐个清理 unused_local_variable: ignore unused_import: ignore linter: rules: # 先启用一些低侵入性的基础规则 - avoid_empty_else - prefer_const_constructors
2. 新增严格规则组,仅应用于指定文件
在同一个配置体系内实现规则局部覆盖:
- 先创建
analysis_options_strict.yaml存放严格规则:
analyzer: strong-mode: implicit-casts: false implicit-dynamic: false errors: unused_local_variable: error unused_import: error linter: rules: # 启用所有你需要的严格规则 - prefer_final_fields - unnecessary_null_checks - avoid_print # ... 补充其他严格规则
- 回到根目录的
analysis_options.yaml,末尾添加规则覆盖逻辑:
include: analysis_options_strict.yaml analyzer: exclude: # 列出所有旧代码目录/文件,这些文件不应用严格规则 - lib/legacy/** - lib/old_feature/** - lib/xxx_old_page.dart # 也可以反向指定仅对新代码目录应用严格规则 # include: # - lib/new_feature/** # - lib/src/new_module/**
这样,除了exclude中的旧代码,新写的、修改后的文件都会自动应用严格规则。
3. 渐进式清理旧代码
- 每次修改旧代码文件时,临时移除该文件在
exclude中的条目,修复当前文件内的严格规则错误后,永久从exclude中删除,纳入严格规则管控。 - 定期批量清理:比如每周选定一个旧模块,集中修复错误后移出
exclude。
4. 精准管控修改文件(可选)
如果想只对git中修改过的文件应用严格规则,可以用脚本生成动态配置:
# 获取当前分支相对于主分支修改的dart文件列表 git diff --name-only main -- lib | grep '\.dart$' > modified_files.txt
通过脚本将未修改的旧文件自动加入exclude列表,适合临时校验场景,长期建议还是按目录/模块划分管控。
注意事项
- 不要维护独立的双配置文件,用
include+exclude的方式更简洁,避免规则不一致。 - CI流程中可单独对新/修改文件运行严格规则检查,旧代码暂时放行,不阻塞流水线。
- 团队约定:新代码必须符合严格规则,修改旧代码时至少修复当前修改部分的规则错误。
内容的提问来源于stack exchange,提问作者ivanesi
相关产品推荐
相关产品推荐

