Version control 在VCS中保留gRPC定义和生成文件的策略

Version control 在VCS中保留gRPC定义和生成文件的策略,version-control,grpc,Version Control,Grpc,我想在一个由多个服务(每个服务都在自己的存储库中)组成的系统中使用gRPC,我想知道在Git中实现版本控制的方法: *.proto文件 生成的代码(主要是Go/Java/Python) 到目前为止,我一直在考虑这样的方法: *.proto文件-可以是: 每个定义都会转到单独的存储库 每个定义都位于实现已定义服务的服务存储库中 生成的代码-以下代码之一: 进入与1中相同的存储库。在上面 进入与第2部分相同的存储库。在上面 根本没有生成代码-它是在实际生成之前由生成的系统/脚本生成的 我

我想在一个由多个服务(每个服务都在自己的存储库中)组成的系统中使用gRPC,我想知道在Git中实现版本控制的方法:

  • *.proto文件
  • 生成的代码(主要是Go/Java/Python)
到目前为止,我一直在考虑这样的方法:

  • *.proto文件-可以是:
  • 每个定义都会转到单独的存储库
  • 每个定义都位于实现已定义服务的服务存储库中
  • 生成的代码-以下代码之一:
  • 进入与1中相同的存储库。在上面
  • 进入与第2部分相同的存储库。在上面
  • 根本没有生成代码-它是在实际生成之前由生成的系统/脚本生成的

我在gRPC方面没有太多经验,我很难判断其中一个是否比其他的好/坏。我可以看到其中的一些优点和缺点(比如良好的IDE集成,不需要生成代码的应用程序等等),但我想知道一些“大”的潜在问题?哪种方法是“最佳实践”?

一般最佳实践是将生成的文件保留在存储库之外,并始终在生成时自动生成它们。例如,当您编译Java程序时,您不会将任何生成的
.jar
文件添加到源代码管理中;这是多余的,而且会让人头疼。protobuf文件也是如此

您可以想象这样的场景:将生成的文件保存在源代码管理中(例如,作为单元测试的黄金文件)是有用的,但是这些文件在个案基础上是特殊的,而不是一般的经验法则,并且可能需要更复杂的机制来确保生成的文件是最新的

请注意,这与从
.proto
文件分发生成的源有细微的不同。并非所有代码用户都希望或能够从源代码重建系统。类似地,您不必将Java项目作为原始代码分发,而是作为
.jar
文件分发