只将 .proto 协议缓冲区文件放在存储库中?

Only put .proto protocol buffer file in a repository?

我想知道关于源存储库的协议缓冲区的最佳实践是什么(例如 git):

我是否必须只将 .proto 文件放入存储库中,让任何其他使用源代码的人使用 protoc 编译器重新生成 类 代码?还是同时放置 .proto 文件和 protoc 编译器生成的源代码是最佳做法?

如果可以避免,则永远不要签入生成的代码。

如果您签入生成的代码,您将承担多种风险,例如:

  • 您可能会失去有关如何正确重新生成该代码的知识。如果它不是作为构建的一部分自动化的,那么很容易忘记记录,或者记录错误。
  • 您冒着生成的代码与架构不同步的风险。例如,有人可以更改 .proto 文件但忘记更新生成的代码。他们的更改实际上不会 "take effect" 直到后来其他人出于某些其他原因重新生成生成的代码——然后突然之间他们看到了他们没有预料到的副作用。
  • 您生成的代码可能适用于与构建器安装的版本不同的协议缓冲区。在这种情况下,它将无法正常工作,因为必须使用完全相同版本的编译器和 运行time 库。

如果出于某种原因您绝对必须签入生成的代码,我强烈建议创建一个自动化测试来检查签入的代码是否与 protoc 在 运行 新鲜时生成的代码相匹配。 (例如,protobuf 存储库本身包含为 descriptor.proto 生成的代码的签入副本,因为编译 protoc 需要此代码,从而创建循环依赖。但是有一个单元测试检查签入代码与 protoc 生成的代码匹配。)

如果您的项目通常以其源代码形式使用(例如,每个用户都应该自己编译的库或程序),我会提供包含生成文件的发布包。

但我不会将生成的文件直接放入存储库中。而且,如果大多数用户将使用编译后的二进制文件,那么提供易于编译的源包也不是那么重要。然后 protobuf 生成器就变成了另一个构建依赖项。