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

fun*_*ust 6 import code-generation path protocol-buffers git-submodules

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

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

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

  • git.dev/fooservice
    • proto(包含git.dev/proto子模块)
    • ...一些java代码
  • git.dev/barservice
    • proto(包含git.dev/proto子模块)
    • ...一些 go 代码
  • git.dev/bazservice
    • proto(包含git.dev/proto子模块)
    • ...一些 JavaScript 代码
  • git.dev/原型
    • 共享
      • 共享原型
    • 餐饮服务
      • 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";
Run Code Online (Sandbox Code Playgroud)

问题一:导入路径

  • 让它import "shared/shared.proto";适用于 git.dev/proto 存储库的 linting 但会在代码生成期间导致导入问题。
  • 让它import "proto/shared/shared.proto";适用于服务存储库中的代码生成,但当然会导致 git.dev/proto 存储库中的linting问题
  • 导入语句应该包含该proto文件夹吗?

问题2:go_package选项

  • 为了构建 go 存根,我们当前使用 prototool 并将其设置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但只要我不将完整的 git 路径添加到 go_package 选项中,这就不会产生有效的 golang 导入路径。这样做当然与 git-submodule 方法冲突(选择哪个 git repo 路径, /proto 或 /*service.git ?)。
  • 将 go_package 与 git-submodules 结合使用的最佳实践是什么?

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

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

谢谢!