我应该将 Flutter/Dart 中生成的代码提交给 VCS

Should I commit generated code in Flutter/Dart to VCS

我正在使用 Flutter 的 Retrofit (https://pub.dev/packages/retrofit) and Json Serializable (https://pub.dev/packages/json_serializable) 库,它们都创建了生成的代码文件,这些文件最终出现在其余的源代码中。是否应在 VCS 中提交生成的 x.g.dart 文件?

在正常的 Android/Java 开发中,生成的文件会进入您不提交的特殊 gen/out/build 文件夹,并且 IDE 通常非常擅长隐藏这些文件。但是由于 Flutter 在源代码中生成它们,我不确定如何处理它们。

有必要提交生成的文件。如果我们没有提交和支持我们正在使用 Jenkins,那么构建将不会生成,因为缺少部分文件。

如果您正在自己构建应用程序 CI 并且您没有将其作为包发布(在 github 上)我不会提交它们并且每次都在 [=12= 上生成它们] 在发布期间。 您真的不想解决生成代码的冲突。

一般情况下最好不要提交生成的文件。正如 build_runner 本身所推荐的那样。这是包的源代码管理部分的 link

另外,它提到了两件事要考虑。

  1. 如果这些建议不同,应以特定建筑商的建议为准。
  2. 在某些情况下,生成的文件会导致 'already exists' 警告。我自己看过很多次。

更新: 您可能希望从 git 提交中忽略它们的一个原因是当您不希望它们显示在正在代码审查的拉取请求中时。在这种情况下,您将忽略项目中 git 提交生成的文件。

TLDR: 如果你将生成的文件添加到你的 git 提交,然后遇到任何问题(你很少这样做)你需要做的就是 运行 build_runner 标志 --delete-conflicting-outputs

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

将生成的文件添加到 Git 提交的问题以及如何处理它们

提到的 build_runner documentation 关于不将生成的文件添加到 git 提交的观点不是一个好观点。稍后我会说为什么。

不必 运行 build_runner 每次执行 git 拉取或更改分支时都不需要添加生成的文件,因为源文件已更改或新建源文件已由您的开发人员添加,您需要 运行 build_runner 为源文件生成文件,以便 运行 代码没有错误。

但是如果您决定将生成的代码添加到您的 git 提交中会怎样?以及如何轻松解决它们。

第一个问题是您可能会在生成的文件中遇到合并冲突。现在你如何处理这个。 你不会。此时你只需解决源文件中的冲突(如果有的话),然后 运行 build_runner 生成的文件将再次生成。

另一个问题是builder_runner docs中提到的问题。这是当你 运行 build_runner 并且它给你这个错误

C:\workspace\flutter\projects> 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


当 运行 宁 build_runner 时,您可以轻松解决购买添加 --delete-conflicting-outputs 标志。就像我们已经做过很多次一样

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

所以对于任何一个问题你运行上面的命令,就是这样

TLDR: flutter 工具还不够先进。今天解决这个问题会给您的项目增加更多的复杂性。一般来说,提交源代码是一个值得商榷的观点,参见 Should I store generated code in source control,但对于 Flutter 具体来说,非常赞成将生成的源代码文件保存在 git.

  • 当前做法: Google 开发 flutter 插件包 (video_player) 的开发人员已将生成的文件提交到他们的存储库。
  • 工具限制: flutter run 似乎不支持 运行ning codegen 编译/构建,因此您要求用户手动 运行 复制 repo 时的代码生成,编写脚本并要求用户执行此操作(并使 IDE 支持 worse/tedious),或设置客户端或服务器端 Git 挂钩.这些都是解决什么问题的复杂性呢?在其他生态系统中您不提交生成的文件这一事实?
    • 导致额外的配置:您可以添加更多的配置工作(和技能要求)以正确设置 IDE。当然,优秀的开发人员可以通过将 Android Studio 配置放入 git 存储库来共享他们的配置,但 Flutter 开发人员可能希望能够 运行 flutter run.
  • 约定优于配置: 开始您项目的开发人员是否需要手动 运行 代码生成或使用您当时使用的特定 IDE ?或者了解如何配置他们选择的 IDE 来启动应用程序?在这种情况下,我们会增加从事该项目的开发人员的开销。以简单为目标,不仅是为了您自己,也是为了其他人。
  • 最小公分母输出: Flutter 与Android / Gradle(或其他生态系统)不同,我们不应该试图使事情保持一致(标准化)以获得最低公分母输出为代价。 Flutter 没有 flutter sync 命令在启动时由 IDE 自动 运行,因此无法自动 运行 此代码生成。

已有讨论:Flutter上有关于提升代码生成体验的讨论(https://github.com/flutter/flutter/issues/63323)。提交生成的文件只是一个功能的一个小方面。