执行build_runner代码生成时遭遇analyzer 6.x相关编译错误
看起来你遇到的是analyzer 6.x版本的API破坏性变更导致的依赖兼容问题,我之前用Riverpod和OpenAPI Generator的时候也踩过几乎一模一样的坑,给你一步步拆解解决办法:
问题根源
你在dependency_overrides里指定了analyzer: ">=6.0.0 <6.6.0",但你的build_resolvers:2.5.4、dart_style:2.3.8这些依赖的旧版本,完全不兼容analyzer 6.x的新API:
- analyzer 6.x直接移除了
FileSource类(原路径package:analyzer/source/file_source.dart) - 删掉了
CompilationUnitElement.libraryImports这个属性 - 修改了
MixinOnClause相关的AST节点定义
这些API变更直接导致旧版本的构建工具代码编译失败。
具体解决步骤
1. 升级构建相关依赖到兼容版本
首先要把build_runner、build_resolvers、dart_style这些和代码生成、语法分析相关的依赖,升级到支持analyzer 6.x的版本:
修改你的pubspec.yaml的dev_dependencies块(也可以直接用命令行快速升级):
dev_dependencies: build_runner: ^2.5.0 # 2.5.0及以上版本完全适配analyzer 6.x build_resolvers: ^2.5.5 # 2.5.5版本修复了analyzer 6.x的API兼容问题 dart_style: ^2.3.9 # 2.3.9开始支持analyzer 6.x的AST结构 # 其他原有开发依赖保持不变
然后运行命令拉取兼容版本:
dart pub upgrade build_runner build_resolvers dart_style
2. 调整analyzer的版本约束(可选)
如果升级后还是出现版本冲突,可以调整dependency_overrides里的analyzer约束,或者直接移除这个override,让pub自动解析最兼容的版本:
dependency_overrides: analyzer: ^6.5.0 # 用更具体的兼容版本区间,或者直接删除这一行
3. 彻底清理缓存并重新执行生成
缓存残留经常会导致奇怪的兼容问题,先彻底清理再重新运行:
# 清理pub全局缓存 dart pub cache clean # 删除本地项目的构建缓存和工具目录 rm -rf .dart_tool build # 重新拉取所有依赖 dart pub get # 重新执行代码生成(--delete-conflicting-outputs会自动处理冲突文件) dart run build_runner build --delete-conflicting-outputs
额外排查点
别忘了检查你本地依赖的dennep_api(path: api/dennep_api)的pubspec.yaml,如果里面有旧的analyzer约束或者过时的生成器依赖,也会导致全局版本冲突,需要同步升级那里的依赖。
验证方法
运行dart pub outdated可以查看所有依赖的版本状态,确认build_runner、build_resolvers、analyzer这几个核心包都处于互相兼容的版本范围。
内容来源于stack exchange

