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

Where to store proto files which are shared among projects?

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

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

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

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

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

至于从原型文件生成代码,我可能会在需要它们的项目中这样做。因此,在您的情况下,项目 C 将仅包含 .proto 文件,而项目 A 和 B 将拉入 .proto 文件并生成它们需要的代码。我觉得必须这样,因为是项目 A 和 B 使用了 protobuf 生成的代码。如果代码是在项目 C 中生成的,那么项目 A 和 B 仍然必须拉取生成的代码才能使用它,并且由于项目 C 在技术上与 A 和 B 分离,因此需要使用哪些语言并不明显生成 - 所有这些?只需要 2 个?

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

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

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

导入生成的代码

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

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

查看此问题了解更多信息。