我尝试在build.yaml
中为构建器freezed
和json_serializable
创建一个build_extensions
规则,以输出目录lib/generated/model
中所有生成的模型,而不管它们的原始位置是否匹配lib/**/*.dart
。
我尝试过的:
- 我希望
'^lib/**/{{}}.dart': 'lib/generated/model/{{}}.g.dart'
可以工作,但它与任何Dart文件都不匹配。 - 我也尝试了
'^lib/{{path}}/{{file}}.dart': 'lib/generated/model/{{file}}.g.dart'
之类的东西,但是{{path}}
需要在目的地中再次匹配,就像documentation一样(为什么还要强制执行这个呢?)
示例:
- 基础模型位置:
lib/core/feature/profile/profile.dart
- 调用
flutter pub run build_runner build --delete-conflicting-outputs
后生成的输出: - x1米11米1x
lib/generated/model/profile.freezed.dart
我当前的build.yaml
(它在相对于原始模型位置的子generated
目录中生成.g.dart
和.freezed.dart
文件)如下所示:
targets:
$default:
builders:
source_gen|combining_builder:
generate_for:
- lib/**.dart
options:
build_extensions:
# I want this line to "work":
# '^lib/**/{{}}.dart': 'lib/generated/model/{{}}.g.dart'
'lib/{{path}}/{{file}}.dart': 'lib/{{path}}/generated/{{file}}.g.dart'
freezed:
options:
build_extensions:
# I want this line to "work":
# '^lib/**/{{}}.dart': 'lib/generated/model/{{}}.freezed.dart'
'lib/{{path}}/{{file}}.dart': 'lib/{{path}}/generated/{{file}}.freezed.dart'
field_rename: snake
explicit_to_json: true
json_serializable:
options:
field_rename: snake
explicit_to_json: true
1条答案
按热度按时间dgiusagp1#
对于其他寻找类似解决方案的人来说,将多个生成的输出放到同一个目录中是不可能的。
生成扩展插件的编写方式必须能够防止两个不同的文件发出相同的输出文件(例如,如果你有
lib/a/foo.dart
和lib/b/foo.dart
,那么在lib/generated/model
中不能有一个foo.g.dart
)。**
不是构建扩展所支持的,和{{}}
应该用来匹配多个字符,然后在目标目录中再次使用。除此之外,构建扩展只匹配后缀。为了避免不同的源目录在输出目录中可能发生冲突的问题,您必须使用类似
lib/generated/model/{{path}}/{{file}}.g.dart
的命令,没有办法将所有内容都放在一个目录中,即使您首先确保生成的文件不会以相同的名称输出。