【问题标题】:Error using source generator from a source generator package使用源生成器包中的源生成器时出错
【发布时间】:2022-01-03 16:41:32
【问题描述】:

我正在编写一个 dart 源生成器,它使用 json_serializable 来处理其中的一些模型。最初源代码生成在一段时间内运行良好,但现在当我运行 dart run build_runner build --delete-conflicting-outputs 时出现错误:

[INFO] 生成构建脚本完成,耗时 410 毫秒
[INFO] 读取缓存资产图已完成,耗时 62 毫秒
[INFO] 检查 自上次构建完成后的更新,耗时 492 毫秒
[警告] 由于构建脚本更新,资产图无效!
[信息] 清理以前构建的输出。完成,耗时 4ms
[INFO] 生成构建脚本完成,耗时 79 毫秒
[警告] 由于缺少资产图,预编译的构建脚本无效。
[警告] lib/settings/config.dart:3:6: 错误:读取时出错 'lib/settings/config.g.dart': 没有这样的文件或目录
部分 'config.g.dart';
^
lib/settings/config.dart:3:6: 错误:不能使用“lib/settings/config.g.dart”作为一部分,因为它没有“一部分” 宣言。
部分'config.g.dart';
^
[INFO] 预编译构建脚本...已完成,耗时 785 毫秒
[严重] 无法预编译构建脚本 .dart_tool/build/entrypoint/build.dart。这很可能是由一个 错误配置的构建器定义。

这是我的包的依赖项:

dependencies:
  path: ^1.8.1
  yaml: ^3.1.0
  dotenv: ^3.0.0
  recase: ^4.0.0
  json_annotation: ^4.4.0
  code_builder: ^4.1.0

  dart_style: ^2.2.1

dev_dependencies:
  lints: ^1.0.0
  test: ^1.20.1
  build_runner: ^2.1.7
  json_serializable: ^6.1.3

而 build.yaml 看起来像这样:

builders:
  map_gen:
    import: "package:map_gen/map_gen.dart"
    builder_factories: [ "build" ]
    build_extensions: { "$lib$": [ ".map.dart" ] }
    auto_apply: dependents
    build_to: source

我无法弄清楚为什么会发生这种情况,或者对于提供自己的生成器的包使用源生成器是否有任何限制。有什么办法可以解决这个问题吗?

编辑

我正在使用 vscode,但我尝试从终端构建并且也遇到了同样的错误。即使在运行flutter clean | dart pub get | dart run build_runner build --delete-conflicting-outputs 之后,同样的错误仍然存​​在。

当前的解决方法

目前我正在手动创建.g.dart 文件并手动添加part of 语句,之后运行build_runner 会成功生成源代码。但是,如果在将生成的方法链接到我的代码后再次运行build_runner.g.dart 文件将被删除,我再次面临同样的错误。每次我想生成源代码时,我都必须重复这个过程。

【问题讨论】:

  • 尝试手动删除缓存。缓存位于文件夹.dart_tool / build
  • @mezoni 也试过了,问题仍然存在。
  • import: "package:map_gen/map_gen.dart" in build.yaml 是什么意思?
  • @mezoni 这就是你如何指出builder_factories 定义的文件,要了解有关源生成过程的更多详细信息,请参阅this
  • 哦,我的意思是,如果pubspec.yaml中没有指定这个包,你怎么能引用它。事实上,这个包在你的项目中是不可用的。但是您仍然参考它(map_gen)。

标签: flutter dart dart-pub flutter-build dart-build


【解决方案1】:

我遇到了完全相同的问题,并在Dart Build's Gitter chat room 中获得了Drift 的创建者的帮助。在这里引用解决方案:

你可以简单地在你的包目录中创建一个空的<project_directory>.build.yaml 文件。这个特殊的 build.yaml 文件只会在从你的包目录开始构建时使用。对于构建系统,它看起来就像您的构建器根本不存在(因此它不会尝试编译它们)。当您从依赖于您的构建器包的其他包运行构建时,<project_directory>.build.yaml 文件将被忽略,并且您的所有构建器都在那里。

你可以参考 Drift 是怎么做的here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多