项目间共享的proto文件存放在哪里?

问题描述 投票:0回答:3

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

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

如果您在项目 A 和项目 B 中都存储了 proto 文件的副本,那么如果项目 A 更改了其 API,那么项目 B 就必须将它们复制过来。当有很多项目使用项目 A 公开的 API 时,这种方法效果不佳。

如果您有一个单独的项目(项目 C)包含共享的原始文件,则可以解决上述问题。那么如何从项目 A 和项目 B 生成 proto 文件呢?

protocol-buffers dependency-management proto
3个回答
39
投票

我建议将

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

至于从原始文件生成代码,我可能会在需要它们的项目中这样做。因此,在您的情况下,项目 C 将仅包含

.proto
文件,项目 A 和 B 将拉入
.proto
文件并生成它们所需的代码。我觉得必须是这样,因为项目 A 和 B 正在使用 protobuf 生成的代码。如果代码是在项目 C 中生成的,那么项目 A 和 B 仍然需要提取生成的代码才能使用它,并且由于项目 C 在技术上与 A 和 B 解耦,因此需要使用哪些语言并不明显。生成 - 全部?只需要2个吗?

通过创建项目 C,您正在创建一个可能为其他项目保存更多

.proto
文件的位置。展望未来,您可能会有许多共享公共基本消息类型的项目。要管理具有许多互连项目的体系结构,尝试合并消息定义非常有意义,如果每个项目都维护自己的定义,这将很困难/不可能,如果存在重复副本,情况会更糟(正如您所说)。将它们存储在一个位置允许新项目拾取现有定义并扩展它们(在进化指南内),并允许更严格地管理和维护一组定义,例如一组经验丰富的审阅者确保一切都一致且明智地完成 - 无论是从建模、命名空间还是版本控制的角度来看。


8
投票

我将提供与@JGC 的精彩答案稍有偏差的内容。请参阅 https://www.bugsnag.com/blog/libraries-for-grpc-services 了解更多详细信息(了解该方法的要点,而不是强制比较)。

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

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

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

请参阅此问题如何维护原始文件以获取更多信息。


0
投票

上述两个答案的第三种选择是选择 monorepo 模式。拥有多语言单一存储库并不理想,但它确实有一个优势,即需要共享诸如

proto
文件之类的界面。

优点是您可以在开发和 CI 过程中更轻松地确保没有重大更改。

当然,缺点是设置单一存储库的复杂性以及由此带来的所有其他复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.