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

kon*_*dor 6 protocol-buffers grpc

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

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

Ken*_*rda 5

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

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

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

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

  • @MoK 说实话,我不知道 Go 的最佳实践是什么,因为我从未编写过任何 Go。我确信 Go 团队已经考虑过这个问题,你应该看看他们的建议。 (2认同)