如何在 JVM 生态系统中外部化 protobuf 文件?

How to externalize protobuf files in JVM ecosystem?

我偶然发现了这个 Akka grpc tutorial,它建议我们可以从 src/main/proto 下有 .proto 文件的项目创建一个 jar,并将其作为依赖项添加到客户端和服务器项目中构建各自的存根。

libraryDependencies += "com.example" %% "my-grpc-service" % "1.0.0" % "protobuf-src"

但这似乎行不通!!是否有任何示例项目可以演示这将如何运作?我们如何将 protobuf 源外部化并在基于 jvm 的项目中使用它们?

我能够根据 akka-grpc docs 的建议弄清楚如何正确地外部化 protobuf 文件。

问题是我没有添加 sbt 所需的 sbt-akka-grpc 插件来识别 .proto 文件并将它们包含在打包的 jar 中。如果没有此插件,打包的 jar 中将不会提供任何 .proto 文件。

addSbtPlugin("com.lightbend.akka.grpc" % "sbt-akka-grpc" % "1.1.0")

确保在 build.sbt 中添加 organization 设置以正确准备 jar。

organization := "com.iamsmkr"

此外,如果您希望将此 jar 交叉编译为多个版本,请在 build.sbt 中添加以下条目:

scalaVersion := "2.13.3"
crossScalaVersions := Seq(scalaVersion.value, "2.12.14")

然后发布:

$ sbt +publishLocal

发布适当的 jar 后,您现在可以将它们作为依赖项添加到您的客户端和服务器项目中,如下所示:

libraryDependencies += 
"com.iamsmkr" %% "prime-protobuf" % protobufSourceVersion % "protobuf-src"

您可以查看 this project 我正在努力查看实际效果。

替代方式

我想到的另一种方法是,您可以将 .proto 文件保存在 root 目录中,然后在客户端和服务器 build.sbt 中引用它们,如下所示:

PB.protoSources.in(Compile) := Seq(sourceDirectory.value / ".." / ".." / "proto")

结帐 this project 以查看实际效果。