如何在git子模块中组织多个协议缓冲区文件?

时间:2019-06-24 06:34:21

标签: import path protocol-buffers code-generation git-submodules

我正在使用git-submodules在多个项目中共享.proto文件。

现在我的问题是如何正确设置导入?

在微服务环境中,所有服务存储库都有一个git-submodule,其中包含共享的.proto文件:

  • git.dev/ fooservice
    • proto(包含git.dev/proto作为子模块)
    • ...一些Java代码
  • git.dev/ barservice
    • proto(包含git.dev/proto作为子模块)
    • ...一些验证码
  • git.dev/ bazservice
    • proto(包含git.dev/proto作为子模块)
    • ...一些JavaScript代码
  • git.dev/ proto
    • 分享了
      • shared.proto
    • fooservice
      • fooservice.proto(导入shared/shared.proto
    • 酒吧服务
      • barservice.proto(导入shared/shared.proto

当前服务原型文件的典型标题如下:

git.dev/proto/fooservice/fooservice.proto

syntax = "proto3";

package abc.foo;

import "shared/shared.proto";

option go_package = "foopb";
option java_multiple_files = true;
option java_outer_classname = "FooProto";
option java_package  = "com.abc.foo";

问题1:导入路径

  • 拥有import "shared/shared.proto";可以使git.dev/ proto 存储库轻巧,但会在代码生成过程中引起导入问题。
  • 拥有import "proto/shared/shared.proto";可以在服务库中生成代码,但是当然会导致git.dev/ proto 回购中的掉毛问题
  • 导入语句是否应包含proto文件夹?

问题2:go_package选项

  • 我们目前使用prototool来构建go存根,并将go_options.import_path设置为例如git.dev/fooservice会生成正确的golang导入路径
  • 另一种选择是运行类似
    • for x in proto/**/*.proto; do protoc -Iproto --go_out=plugins=grpc,paths=source_relative:src/proto $x; done,但这不会导致有效的golang导入路径,只要我不将完整的git路径添加到go_package选项即可。这样做当然与git-submodule方法(选择哪个git repo路径,/ proto或/*service.git吗?)冲突。
  • 将go_package与git-submodules结合使用的最佳实践是什么?

问题3:子模块和第三方工具

  • 使用git-submodules和诸如prototool之类的第三方工具是跨多个项目使用proto文件的正确方法吗?

谢谢!

0 个答案:

没有答案