build.yaml配置json_serializable无法生成序列化代码及增量生成咨询
问题解答
一、build.yaml配置无法生成序列化代码的解决办法
- 确认文件位置:build.yaml必须放在项目根目录,和pubspec.yaml同级,不能放在子文件夹中。
- 补全配置项:可以尝试显式声明
build_extensions(json_serializable默认有配置,但显式声明能避免潜在的匹配问题),修改后的配置如下:
targets: $default: builders: json_serializable: enabled: true generate_for: include: - lib/foo.dart build_extensions: .dart: [.g.dart]
- 清理缓存后重建:先执行
dart run build_runner clean清除旧生成文件和缓存,再运行dart run build_runner build重新生成代码。 - 验证文件注解:确保
lib/foo.dart中已添加part 'foo.g.dart';声明,且目标类上标注了@JsonSerializable()注解——这是代码生成的必要前提。
二、指定文件范围是否影响构建耗时?
不一致。
- 当通过
generate_for指定include范围后,build_runner只会扫描并处理匹配的文件,跳过项目中无关文件,耗时会明显更短,大型项目中差距尤为显著。 - 若不指定范围,build_runner会遍历所有符合json_serializable规则的文件(即带有
@JsonSerializable注解的dart文件),处理内容更多,耗时自然更长。
三、如何实现增量生成,避免影响已生成的文件?
- 利用默认增量机制:build_runner本身默认支持增量构建,只要不执行
clean命令。后续新增或修改lib/bar.dart时,直接运行dart run build_runner build,只会处理变化的文件,不会重新生成foo.dart对应的.g.dart文件。 - 逐步扩展build.yaml范围:先配置include
lib/foo.dart完成生成,之后修改build.yaml添加lib/bar.dart,再次构建时只会处理新增的bar.dart,不会改动已有的foo相关生成文件。 - 使用--build-filter精准控制:如果只想为单个文件生成代码,直接在命令行指定:
dart run build_runner build --build-filter="lib/bar.dart"
这样只会处理指定的bar.dart,完全不会影响之前生成的foo相关文件。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

