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

Posted

技术标签:

【中文标题】我应该将 Flutter/Dart 中生成的代码提交给 VCS【英文标题】:Should I commit generated code in Flutter/Dart to VCS 【发布时间】:2019-09-30 07:09:36 【问题描述】:

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

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

【问题讨论】:

我认为如果您要发布一个包,它必须在那里,因为该包不会为您重新生成代码。我知道我提交了我的,但我已经有一段时间没有制作我的包裹了,所以我不太记得了。 如果你正在构建一个包,这是有道理的。我只是为了好玩和学习语言而开发一个应用程序。我想我现在会提交生成的文件。 【参考方案1】:

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

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

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

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

提到的build_runnerdocumentation 不将生成的文件添加到您的 git 提交不是一个好点。稍后我会说原因。

添加生成文件的重点不是每次执行 git pull 时都必须运行 build_runner,因为源文件已更改或您的开发人员已添加新的源文件,您需要运行 build_runner 来创建源文件,以便能够无错误地运行代码。

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

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

另一个问题是builder_runnerdocs 中提到的问题。当你运行 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 

因此,对于任何一个问题,您都可以运行上述命令,就是这样

【讨论】:

【参考方案2】:

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

【讨论】:

是的,你不想这样做。但你也不需要。您只需解决源文件中的冲突(如果有),然后运行 ​​build_runner【参考方案3】:

TLDR: Flutter 工具在这方面不够先进。今天解决这个问题会给你的项目增加更多的复杂性。一般提交源代码是一个有争议的观点,见Should I store generated code in source control,但特别是对于Flutter,它非常赞成将生成的源代码文件保存在git中。

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

现有讨论: Flutter 上有一个关于改进代码生成体验的讨论 (https://github.com/flutter/flutter/issues/63323)。提交生成的文件只是一项功能的一小部分。

【讨论】:

类似于“冻结”源代码生成器,github.com/flutter/flutter/issues/63323#issuecomment-1001240880【参考方案4】:

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

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

    如果不同,具体的建筑商建议应取代这些建议。 在某些情况下,生成的文件可能会导致“已存在”警告。我自己也见过很多次。

【讨论】:

.dart_tool 是一种不同类型的生成文件(即它不是代码)。这个问题与包含源代码的生成文件有关,例如通过Pigeon 和json_serializable。【参考方案5】:

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

【讨论】:

以上是关于我应该将 Flutter/Dart 中生成的代码提交给 VCS的主要内容,如果未能解决你的问题,请参考以下文章

是否可以用Dart / Flutter绘制图像?

我应该如何处理默认助手或 twitterBootstrap 助手在我的 Play 2 应用程序中生成的 html 输出

在eclipse中生成的java代码自动完成

如何查看查询转换器在 Oracle 中生成的查询

jpa中生成的表中的错误排序

Maven - 如何处理生成的类