如何控制级联Source Generator的执行顺序?
Source Gen子系统本身支持链式生成场景,只是需要正确配置和遵循规范才能避免执行顺序问题,以下是具体解决方法:
明确生成器的依赖与执行顺序
在项目根目录的build.yaml中为自定义生成器配置依赖关系。比如你的Swagger生成器输出的代码需要被json_serializable处理,可通过配置确保自定义生成器先执行,再触发目标生成器:targets: $default: builders: your_package|swagger_generator: enabled: true json_serializable: enabled: true depends_on: - your_package|swagger_generator确保生成代码的输出类型正确
在自定义Generator代码中,生成文件时要标记为SourceOutput类型,让Build Runner将其视为可被其他生成器扫描的源文件,而非最终输出文件:@override FutureOr<void> generate(LibraryReader library, BuildStep buildStep) async { final generatedCode = // 你的代码生成逻辑 await buildStep.writeAsString( buildStep.inputId.changeExtension('.g.dart'), generatedCode, isSource: true, // 标记为源输出,允许后续生成器处理 ); }保证生成代码的幂等性
禁止生成带可变内容(如时间戳、随机标识)的代码,确保只有输入的Swagger Schema发生变化时,才更新生成代码。无关的内容变动会干扰Build Runner的增量构建逻辑,导致执行顺序混乱。规范处理增量构建缓存
出现执行顺序错误时,不要手动修改文件,直接执行build_runner clean清理所有缓存与生成文件,再运行build_runner build --delete-conflicting-outputs重新构建。手动修改文件会破坏Build Runner的增量构建判断,引发更复杂的问题。针对MobX生成器的特殊适配
MobX生成器对类结构、注解位置要求严格,确保自定义生成器输出的代码完全符合MobX规范:比如正确添加part 'xxx.g.dart';、@mobx注解位置准确,同时在build.yaml中明确MobX生成器依赖于自定义生成器,避免因扫描时机问题导致注解未被识别。
Source Gen的设计核心就是支持多生成器协作场景,通过构建系统的依赖管理、增量构建和源文件标记机制保证链式生成的稳定性,遵循上述规范即可避免大部分执行顺序问题。
内容的提问来源于stack exchange,提问作者Adam

