项目之间共享的原型文件存储在哪里?

时间:2019-05-16 09:10:15

标签: protocol-buffers dependency-management proto

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

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

如果您在项目A和项目B中都存储了原始文件的副本,则如果项目A更改了其API,则项目B必须将其复制过来。当有许多项目使用项目A公开的API时,这种方法就行不通了。

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

2 个答案:

答案 0 :(得分:2)

我将与@JGC的好答案略有不同。有关更多详细信息,请参见https://www.bugsnag.com/blog/libraries-for-grpc-services(有关方法的要点,而不是命令比较)。

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

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

想象一下,项目c中的一个原型用于生成go文件,并且可以将其导入另一个go项目(项目a)中。项目c还将生成的JavaScript文件(或其他内容)发布到npm注册表。我还不知道dart的工作原理如何,但可以想象它还为您的flutter应用程序生成了客户端代码,并且您也从c项目中获取了它。

iOS应用程序出现故障,但找到标题为

的问题

如何维护原始文件

一个很好的解释

答案 1 :(得分:1)

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

关于从原始文件生成代码,我可能会在需要它们的项目中这样做。因此,在您的情况下,项目C仅包含.proto文件,而项目A和B将拉入.proto文件并生成所需的代码。我感觉必须是这种方式,因为是项目A和B消耗了protobuf生成的代码。如果代码是在项目C中生成的,则项目A和B仍将必须拉出生成的代码才能使用它,并且由于项目C在技术上与A和B脱钩,因此不清楚需要使用哪种语言生成-全部?只是需要的两个?

通过创建项目C,您正在创建一个场所,该场所可能为其他项目容纳更多.proto文件。展望未来,您可能会拥有许多共享通用基本消息类型的项目。要管理具有许多互连项目的体系结构,尝试合并消息定义非常有意义,如果每个项目都保留自己的定义,这将是困难/不可能的,如果有重复的副​​本,则更糟(如您所说)。将它们存储在一个位置中可以使新项目选择现有的定义并对其进行扩展(在进化准则之内),并且可以更严格地管理和维护一组定义,例如一组经验丰富的审阅者,确保从建模,命名空间或版本控制的角度来看,所有事情都是一致且明智的。