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

如何在build.yaml中配置build_extensions统一输出Flutter生成模型?

统一输出freezed/json_serializable生成文件到指定目录的build.yaml配置方案

需求说明

需要在build.yaml中配置构建规则,将所有lib/**/*.dart路径下的模型文件对应的生成文件(.g.dart和.freezed.dart)统一输出到lib/generated/model目录,不受原文件位置影响。

示例效果:

  • 原模型文件:lib/core/feature/profile/profile.dart
  • 执行构建命令flutter pub run build_runner build --delete-conflicting-outputs后,期望生成:
    • lib/generated/model/profile.g.dart
    • lib/generated/model/profile.freezed.dart

之前尝试的无效方案

  • 尝试规则'^lib/**/{{}}.dart': 'lib/generated/model/{{}}.g.dart',无法匹配任何Dart文件
  • 尝试规则'^lib/{{path}}/{{file}}.dart': 'lib/generated/model/{{file}}.g.dart',但文档要求{{path}}必须在目标路径中重复使用,无法满足统一输出的需求

正确配置方案

以下是修改后的build.yaml,可实现统一输出到指定目录的需求:

targets:
  $default:
    builders:
      source_gen|combining_builder:
        generate_for:
          - lib/**/*.dart
        options:
          build_extensions:
            '^lib/**/{{basename}}.dart': 'lib/generated/model/{{basename}}.g.dart'
      freezed:
        options:
          build_extensions:
            '^lib/**/{{basename}}.dart': 'lib/generated/model/{{basename}}.freezed.dart'
          field_rename: snake
          explicit_to_json: true
      json_serializable:
        options:
          field_rename: snake
          explicit_to_json: true

配置关键点解释

  1. 输入匹配规则^lib/**/{{basename}}.dart:

    • ^表示从项目根目录开始匹配路径
    • **匹配所有层级的子目录
    • {{basename}}提取原文件的无扩展名文件名,直接忽略原文件所在的子路径,实现统一输出
  2. 关于{{path}}强制规则的说明:
    当使用{{path}}占位符时,构建系统要求输入与输出路径结构对应,目的是避免不同目录下的同名文件生成结果互相覆盖。但通过**通配符结合{{basename}}占位符,我们直接提取文件名而丢弃原路径,即可绕过该规则,同时需自行注意处理不同目录下的同名文件冲突问题。

内容的提问来源于stack exchange,提问作者Deniss Zerkalijs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:01:12