Protocol buffers 在何处存储项目间共享的原型文件?

Protocol buffers 在何处存储项目间共享的原型文件?,protocol-buffers,dependency-management,proto,Protocol Buffers,Dependency Management,Proto,我有项目A和项目B。它们可能使用不同的编程语言。 项目A使用proto文件公开API,项目B将使用proto文件以项目B使用的编程语言生成API 但是原始文件存储在哪里呢?使用protobuf的传统方法是什么?是否将从proto文件生成的文件添加到版本控制 如果您在项目a和项目B中都存储了原始文件的副本,那么如果项目a更改了其API,那么项目B将不得不复制它们。当有许多项目使用projecta公开的API时,这种方法并不奏效 如果您有一个单独的项目projectc,其中包含共享的proto文件,

我有项目A和项目B。它们可能使用不同的编程语言。 项目A使用proto文件公开API,项目B将使用proto文件以项目B使用的编程语言生成API

但是原始文件存储在哪里呢?使用protobuf的传统方法是什么?是否将从proto文件生成的文件添加到版本控制

如果您在项目a和项目B中都存储了原始文件的副本,那么如果项目a更改了其API,那么项目B将不得不复制它们。当有许多项目使用projecta公开的API时,这种方法并不奏效


如果您有一个单独的项目projectc,其中包含共享的proto文件,则可以解决上述问题。但是如何从项目A和项目B生成proto文件呢?

我建议将
.proto
文件存储在单独的项目中。这是两个项目之间的合同,它们不一定由任何一个“拥有”。将它们存储在单独的项目中为两个项目成员协商对文件的更改提供了中立的基础—例如,通过拉/合并请求过程,其中可能有来自两个项目的成员充当审阅者

至于从proto文件生成代码,我可能会在需要它们的项目中这样做。因此,在您的例子中,项目C将只包含
.proto
文件,而项目A和B将把
.proto
文件拉入并生成它们需要的代码。我觉得必须是这样,因为项目A和B正在使用protobuf生成的代码。如果代码是在项目C中生成的,那么项目A和B仍然需要提取生成的代码才能使用它,而且由于项目C在技术上与A和B是解耦的,因此不清楚需要生成哪些语言—所有这些语言?只需要两个


通过创建project C,您正在创建一个可能容纳更多其他项目的
.proto
文件的位置。展望未来,您可能会有许多共享公共基本消息类型的项目。要管理一个包含许多相互关联项目的体系结构,尝试并整合消息定义是非常有意义的,如果每个项目都维护自己的定义,那么这将是困难的/不可能的,如果存在重复的副本,情况会更糟(如您所说)。将它们存储在一个位置允许新项目拾取现有定义并扩展它们(在进化指南内),并允许对定义集进行更严格的管理和维护,例如,一组经验丰富的评审员确保所有工作都是一致和明智的-无论是从建模开始的,名称空间或版本控制透视图。

我将提供一个与@JGC伟大答案的小偏差。有关更多详细信息,请参阅(有关该方法的要点,而不是必要的比较)

当您将原型文件放在单独的存储库中时,该存储库也可以生成客户机代码。例如,对于Golang中的客户机,生成的代码(也可以是Golang)可以导入,即使它位于单独的存储库中。这意味着项目a和/或b可以轻松地从项目c导入生成的代码

对于不同的语言,从projectc导入生成的客户机代码可能需要的不仅仅是repo中的一个文件。但我可以想象c项目可以设置不同的ci/cd方法,以允许发布适当的包

假设项目c中的一个proto用于生成go文件,该文件可以导入到另一个go项目(项目a)中。项目c还将生成的JavaScript文件(或其他文件)发布到npm注册表。我还不知道dart是如何工作的,但想象一下它也为你的Flitter应用程序生成了客户端代码,你也从ProjectC获得了它

iOS应用程序有问题,但找到标题为

如何维护proto文件


对于一个好的解释

这是一个很好的例子,而且肯定是在这一行,但是project a或b如何从外部回购“拉入”一个原型文件,并使用它来编译代码呢?也许你可以看看我对这个答案的评论。一种方法是将项目C作为git子模块添加到项目a/B中,另一种方法是将文件发布到两者都可以访问的位置。另一种方法是直接从源项目卷曲文件。我更喜欢使用git子模块。