在build.yaml中是否有一个build_extensions规则来将所有生成的Flutter模型输出到一个公共目录中?

f8rj6qna  于 2022-12-27  发布在  Flutter
关注(0)|答案(1)|浏览(147)

我尝试在build.yaml中为构建器freezedjson_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
dgiusagp

dgiusagp1#

对于其他寻找类似解决方案的人来说,将多个生成的输出放到同一个目录中是不可能的。
生成扩展插件的编写方式必须能够防止两个不同的文件发出相同的输出文件(例如,如果你有lib/a/foo.dartlib/b/foo.dart,那么在lib/generated/model中不能有一个foo.g.dart)。**不是构建扩展所支持的,和{{}}应该用来匹配多个字符,然后在目标目录中再次使用。除此之外,构建扩展只匹配后缀。
为了避免不同的源目录在输出目录中可能发生冲突的问题,您必须使用类似lib/generated/model/{{path}}/{{file}}.g.dart的命令,没有办法将所有内容都放在一个目录中,即使您首先确保生成的文件不会以相同的名称输出。

相关问题