首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何维护Proto文件?

如何维护Proto文件?
EN

Stack Overflow用户
提问于 2020-02-29 10:56:34
回答 2查看 6.7K关注 0票数 9

我已经创建了3个proto文件,并希望将其保存在git中:

从其他文件中分离出来。存储库仅包含.proto 文件。我有3个微服务,每个服务都有自己的存储库,使用这些proto文件相互通信:

在上面的图片中,您可以看到proto文件是从不同的微服务中消耗的。

假设我将更改Protofile2并将更改推送到proto存储库,请记住proto文件存储库与微服务存储库是分开的:

当我运行go test on service1 service2 时,应该告诉我,Protofile2已经更改,或者在service2文件夹中没有与proto文件相同的散列:

我必须再次生成代码。

有没有解决这个问题的工具?或者我该怎么解决呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-29 13:14:49

以下是我的建议:

  • 将您的原型(以及它们的go生成的makefile)存储在一个git中。为便于导入,每个定义都应该位于自己的目录中。
  • 用版本标记回购??特别是在潜在的破坏更改时。
  • 从微服务(如import "github.com/me/myproto/protodef2" )导入特定的proto防御
  • 使用go模块 (在2019年与go v1.11一起引入)以确保微服务X获得兼容版本的protobuf Y

如@PaulHankin所述,第2点--尽量不要破坏向后兼容性。Protobuf字段可以删除,但只要其余字段索引未被更改,旧客户端调用仍将与较新的Protobuf兼容。

票数 6
EN

Stack Overflow用户

发布于 2020-02-29 12:52:52

通常,尝试使协议缓冲区向后兼容,这样依赖于proto文件的服务不一定需要在proto文件更改时进行更改。请参阅https://developers.google.com/protocol-buffers/docs/proto3#updating

但是,如果要检查,可以使用proto.GetProperties(msgType)编写测试。将预期的struct属性放在文字中,并使用reflect.DeepEqual将其与在proto的动态类型上调用proto.GetProperties获得的动态结构属性进行比较。就像这样:

代码语言:javascript
复制
func TestMyProtoStructVersion(t *testing.T) {
    gotProps := proto.GetProperties(reflect.TypeOf(&mypb.MyProtoStruct{}))
    if !reflect.DeepEqual(gotProps, wantMyProtoStructProps) {
        t.Errorf("MyProtoStruct proto has changed")
    }
}

您可以使用go generate自动创建包含协议缓冲区的预期结构属性(wantMyProtoStructProps)的文件,该文件可以包含在测试中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60464363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档