在 Web 应用程序的客户端和服务器中,您是否需要 protobufs 的副本?

Do you need copies of protobufs in both client and server in web applications?

我不确定这个论坛是否适合 post 这个问题,但我正尝试在 Web 应用程序的上下文中学习 gRPC/protobufs。我在 Flutter 中构建 UI,在 Go 中构建后端 MongoDB。我能够获得一个简单的 go 服务 运行 并且我能够使用 Kreya 查询它,但是我现在的问题是 - 如何将 UI 与后端集成?为了进行 Kreya 调用,我需要导入 protobufs。我是否需要在前端和后端维护相同的 protobufs?意思是,我真的必须将后端中的所有 protobuf 复制到我的 UI 代码库中并在那里进行本地编译吗?这似乎是维护的噩梦,因为现在必须在两个地方维护 protobuf,而不是一个。

维护 protobuf 的最佳方法是什么?

是的,但是将原型视为您的客户端和服务器之间的共享(合同)。

原型定义了客户端能够与服务器通信的接口。为了使其有效,客户端和服务器需要实现相同的接口。

实现此目的的一种方法是将您的原型存储在您在实现它的任何客户端和服务器中共享的存储库中。这提供了原型的单一真实来源。我还生成了编译 (protoc) 到我将使用的语言的原型副本,例如Golang、Dart 等在这个共享的 protos 仓库中,并在需要的地方从仓库中导入。

然后,在您的情况下,客户端导入 Dart 生成的源,Golang 服务器从共享存储库导入 Golang 生成的源。

或者,您的客户端和服务器可以在需要时protoc编译适当的源代码,通常作为自动构建过程的一部分即时编译。

尽量不要在客户端和服务器之间复制原型,因为这会使保持一致性变得困难;确保每个副本保持同步将是一项挑战。