如何在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.dartlib/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
配置关键点解释
输入匹配规则
^lib/**/{{basename}}.dart:^表示从项目根目录开始匹配路径**匹配所有层级的子目录{{basename}}提取原文件的无扩展名文件名,直接忽略原文件所在的子路径,实现统一输出
关于
{{path}}强制规则的说明:
当使用{{path}}占位符时,构建系统要求输入与输出路径结构对应,目的是避免不同目录下的同名文件生成结果互相覆盖。但通过**通配符结合{{basename}}占位符,我们直接提取文件名而丢弃原路径,即可绕过该规则,同时需自行注意处理不同目录下的同名文件冲突问题。
内容的提问来源于stack exchange,提问作者Deniss Zerkalijs
相关产品推荐
相关产品推荐

