为什么在Dart/Flutter中使用build_runner序列化JSON时不会生成文件?

42

我只是想用之前保存的命令来生成文件(大约3个月前),但现在无法生成文件了(我不太懂后端和DevOps)。 它告诉我要使用删除命令,但是即使使用那个命令,我的文件仍然无法生成。 下面是我的日志信息,以及一个简单类的代码。

我猜可能与我更改 GitHub 帐户有关,因为提到了权限问题。

我在 Windows 10 中使用 VS Code。

日志文件:

E:\1 Work\flutter_pilot> flutter pub run build_runner build
[INFO] Generating build script...
[INFO] Generating build script completed, took 336ms

[WARNING] Deleted previous snapshot due to missing asset graph.
[INFO] Creating build script snapshot......
[INFO] Creating build script snapshot... completed, took 12.5s

[INFO] Initializing inputs
[INFO] Building new asset graph...
[INFO] Building new asset graph completed, took 787ms

[INFO] Checking for unexpected pre-existing outputs....
[INFO] Found 13 declared outputs which already exist on disk. This is likely because the`.dart_tool/build` folder was deleted, or you are submitting generated files to your source repository.
[SEVERE] Conflicting outputs were detected and the build is unable to prompt for permission to remove them. These outputs must be removed manually or the build can be run with `--delete-conflicting-outputs`. The outputs are: lib/models/advisory-service-item.g.dart
lib/models/advisory-service.g.dart
lib/models/auth.g.dart
lib/models/contract.g.dart
lib/models/contributor.g.dart
lib/models/exact-cost-values.g.dart
lib/models/exact-cost.g.dart
lib/models/expert.g.dart
lib/models/paginator-info.g.dart
lib/models/person.g.dart
lib/models/project.g.dart
lib/models/system-country.g.dart
lib/models/user.g.dart
pub failed (78)

类文件:

import 'package:json_annotation/json_annotation.dart';
part 'organisation.g.dart';

@JsonSerializable()
class Organisation {
  final String name;
  Organisation({this.name});

  factory Organisation.fromJson(Map<String, dynamic> json) => _$OrganisationFromJson(json);

  Map<String, dynamic> toJson() => _$OrganisationToJson(this);
}
22个回答

121

我遇到了类似的问题,但我使用的是Android Studio IDE,并且已经执行了以下步骤:

文件 => 清除缓存 / 重启

运行以下命令:

flutter clean

flutter pub get

flutter packages pub run build_runner build --delete-conflicting-outputs  
     

关于 --delete-conflicting-outputs

假设用户包中的冲突输出来自先前的构建,请跳过通常提供的用户提示。

参考资料


20

如果你仔细阅读错误信息,你会发现它要求在命令的末尾添加--delete-conflicting-outputs。因此,您应该尝试 flutter packages pub run build_runner build --delete-conflicting-outputs


1
正如我之前所说(也许用更生硬的英语,因为这不是我的母语),我已经尝试过了,但文件只会被删除,没有任何生成。 - morgred
我明白了。不过看起来命令停在了user.g.dart文件上?你有检查过这个文件吗?我有时也会遇到这个错误,然后发现我只是在某个地方打错了字或者缺少了'something.g.dart'的代码。 - Rick
用户是列表中的最后一个文件。我已经检查过了,它只是一个名称和一个id的获取和设置,没有任何问题。 - morgred
非常抱歉无法帮助您识别问题。但根据我的过去经验,出现这种错误通常是由于拼写错误、错误代码或缺少“file.g.dart”代码等原因。然而,如果您愿意与我分享您的代码,我可以花一些时间帮助您找到问题所在。 - Rick
@Bawantha 你的意思是删除该包及其生成的文件,然后让Flutter再次更新包吗? - morgred
显示剩余2条评论

19
只需运行这个:
flutter pub run build_runner build --delete-conflicting-outputs

1
这应该是被接受的答案。简单明了。 - Alimov Shohrukh
是的 @AlimovShohrukh - Shashank Daima

10
在我的情况下,将part 'file_name.g.dart';添加到文件顶部有所帮助。
file_name.dart:
import 'package:json_annotation/json_annotation.dart';

part 'file_name.g.dart';

@JsonSerializable()
class YourClass {

    factory YourClass.fromJson(Map<String, dynamic> json) => _$YourClassFromJson(json);

    Map<String, dynamic> toJson() => _$YourClassToJson(this);

    // ... your class code
}

我需要这个来让 flutter pub run build_runner build --delete-conflicting-outputs 去获取文件并创建 .g.dart 文件。 - jaredbaszler
哇,我在文件名中打错了一个字母,感谢你的回答。 - David Holkup
part行添加(即使VSCode会抛出错误,因为它尚未生成)对我来说是可行的... - Aldy J

9

我曾经遇到同样的问题。通过使用下面的命令解决了问题。

flutter packages pub run build_runner build --delete-conflicting-outputs  

运作得很顺利。 - Shoaib Kakal

7

将部分和类名改为文件相同的名称,解决了我的问题。


7
我认为这种情况发生在大多数人身上的主要原因是:当您之前运行此命令时,您已将生成的“g.dart”文件添加到源代码控制中。这会阻止“build_runner”再次生成以前生成的“g.dart”文件,即使您只需要新的“g.dart”文件。现在,我知道这可能有点难以理解,但请考虑以下情况:
  1. 假设您有一个名为“search_entry.dart”的文件。
  2. 您运行了该命令,并成功生成了“search_entry.g.dart”文件。
  3. 然后,您继续将生成的“search_entry.g.dart”文件添加到源代码控制存储库中。
  4. 您又创建了另一个文件,也就是“cached_data_entry.dart”。
  5. 当您第二次运行命令以生成“cached_data_entry.dart”文件时,它将尝试删除“search_entry.g.dart”文件以重新生成“search_entry.g.dart”和“cached_data_entry.dart”文件。
  6. 由于“search_entry.g.dart”受源代码控制保护,构建运行程序将无法删除它,因此会出现错误。
  7. 现在,您需要做的是删除先前生成的所有“g.dart”文件(例如我们的“search_entry.g.dart”),然后将其添加到源代码控制的“ .gitignore”文件中忽略这些文件。然后再次运行命令,希望这次能够成功。
  8. 将来,您应该立即从源代码控制中忽略这些文件,而不是等到以后再删除它们。
现在,最后,我希望我已经讲得清楚了。

2
源代码控制从何时开始不允许编辑或删除文件? - vrnvorona
@vrnvorona 我认为措辞不够精确。在 OP 的示例中,由于 search_entry.g.dart 被跟踪到源代码控制中,分支更改或合并将修改它,使得 build_runner 检测到外部更改并将该文件视为冲突输出。这在文档中有描述。 - enzo
无论如何,这个答案很好地解释了什么是冲突输出以及为什么会发生。 - enzo

4
运行 "flutter pub upgrade" 命令解决了我的问题。

4
问题出在软件包依赖上,执行这个命令 flutter pub upgrade --major-versions 就可以解决问题。

问题已经解决,谢谢。 - Nazarii Kahaniak

4

尝试通过终端执行以下命令:

  1. 使用命令删除之前生成的文件:find ./ -name '*.g.dart' -delete
  2. 然后执行:flutter packages pub run build_runner watch —delete-conflicting-outputs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接