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

stw*_*ykd 16 protocol-buffers dependency-management proto

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

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

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

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

JGC*_*JGC 15

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

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

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

  • 所以这很棒,并且绝对符合 /sf/answers/4232586711/ 的行,但是项目 a 或 b 如何从外部存储库“拉入”一个原始文件并使用它来编译代码?也许你可以看看我对该答案的评论。试图解决这个问题 (2认同)
  • 一种方法是将项目 C 作为 git 子模块添加到项目 A/B 中。另一种方法是将文件发布到双方都可以访问的位置。另一种方法是直接从源项目中卷曲文件。我的偏好是使用 git 子模块。 (2认同)

Yeh*_*rov 9

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

\n

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

\n

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

\n

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

\n

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

\n