You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制级联Source Generator的执行顺序?

Dart 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:19