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

时间:2016-12-16 14:42:09

标签: protocol-buffers grpc

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

我是否必须将.proto文件放在存储库中,并让使用源代码的其他任何人使用protoc编译器重新生成类代码?或者将两个.proto文件和protoc编译器生成的源代码放在一起是最好的实践吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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

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