Protocol buffers 将第三方.proto文件带到ScalaPB

Protocol buffers 将第三方.proto文件带到ScalaPB,protocol-buffers,scalapb,Protocol Buffers,Scalapb,我如何判断它应该从Internet获取.proto依赖项,例如 google/api/annotations.protofrom 背景: 目的是通过gRPC从Scala读取ETCDv3API 我从他们的项目中选择了etcd特定的.proto文件,并将其放在我的项目下。它起作用了。然而,依赖关系开始深入,必须有更好的方法 ScalaPB邮件列表上的一条消息告诉我们,从在线获取依赖项是不可能的。将副本放在自己的项目中是正确的方法。更新:sbt protoc可以从maven下载并提取带有protos的

我如何判断它应该从Internet获取
.proto
依赖项,例如

google/api/annotations.proto
from

背景:

目的是通过gRPC从Scala读取ETCDv3API

我从他们的项目中选择了etcd特定的
.proto
文件,并将其放在我的项目下。它起作用了。然而,依赖关系开始深入,必须有更好的方法


ScalaPB邮件列表上的一条消息告诉我们,从在线获取依赖项是不可能的。将副本放在自己的项目中是正确的方法。

更新:sbt protoc可以从maven下载并提取带有protos的JAR。它还可以设置为为这些第三方proto生成Scala代码

下面是如何做到这一点。在build.sbt中:

导入scalapb.compiler.Version.scalapbVersion
val GrpcProtosArtifact=“com.google.api.grpc”%”grpc谷歌通用协议“%”1.17.0
规模规避:=“2.12.10”
//此子项目将保存外部数据库中编译的Scala类
//罐子。
lazy val googleCommonProtos=(文件中的项目(“google CommonProtos”))
.设置(
名称:=“谷歌通用协议”,
//将标记为“protobuf”的依赖项提取到目标/protobuf_外部
libraryDependencies++=Seq(
GrpcProtosArtifact%“protobuf”
),
//除了我们关心的JAR之外,protobuf_外部目录
//将包含来自谷歌标准protos的protos。
//为了避免编译我们不使用的东西,我们限制了我们需要的东西
//编译到protobufu external的子目录
编译中的PB.protoSources+=target.value/“protobuf_外部”/“谷歌”/“类型”,
PB.targets in Compile:=Seq(
scalapb.gen()->(sourceManaged in Compile).value
)
)
//这个子项目就是你的代码所在。它包含导入proto的proto文件
//从外部原型罐。
lazy val myProject=(文件中的项目(“我的项目”))
.设置(
名称:=“我的项目”,
//此子项目中的protos依赖于中的protobufs
//GrpcProtosArtifact,所以我们也需要在这里提取它们。这个
//现在我们不把它们添加到'PB.protoSources'中,这样它们就不会编译了。
libraryDependencies++=Seq(
GrpcProtosArtifact%“protobuf”
),
PB.targets in Compile:=Seq(
scalapb.gen()->(sourceManaged in Compile).value
),
)
.dependsOn(googleCommonProtos)//从googleCommonProtos获取编译的Scala类
完整示例如下:


旧答案,过时:

ScalaPB不处理第三方依赖项的下载,但让SBT为您下载并告诉ScalaPB构建下载的protos相当容易

下面的示例
build.sbt
定义了一个
extractProtos
任务,该任务从github下载链接到的repo的主分支作为zip文件,并将其解压缩。在执行任何操作之前,它会检查目标目录是否不存在,以防止每次编译时反复下载zip

因为里面有很多proto,所以我们过滤zip文件。源根被提取到
target/scala-2.12/resource\u managed/googleapis master
,我们在Compile中将其添加到
PB.protocSources
中,因此当调用protoc时,它会处理这些文件

您可以在
src/main/protobuf
中添加更多源代码,并让它们
导入“google/rpc/…”


回答得很好!我只需要两个.proto文件(api/annotations.proto,api/http.proto)。不使用bigtable/admin/v2/*安全吗?是的,只保留您需要的,这只是一个示例。
scalaVersion := "2.12.2"

libraryDependencies ++= Seq(
    "io.grpc" % "grpc-netty" % com.trueaccord.scalapb.compiler.Version.grpcJavaVersion,
    "com.trueaccord.scalapb" %% "scalapb-runtime-grpc" % com.trueaccord.scalapb.compiler.Version.scalapbVersion
)

PB.targets in Compile := Seq(
  scalapb.gen() -> (sourceManaged in Compile).value
)

PB.generate in Compile := (PB.generate in Compile).dependsOn(extractProtos).value

PB.protoSources in Compile += resourceManaged.value / "googleapis-master"

lazy val extractProtos = Def.task {
  if (!(resourceManaged.value / "googleapis-master").exists) {
    val zipUrl = "https://github.com/googleapis/googleapis/archive/master.zip"
    println(s"Unzipping $zipUrl.")
    IO.unzipURL(
        from=url(zipUrl),
        filter=(
          "googleapis-master/google/bigtable/admin/v2/*" |
          "googleapis-master/google/api/*" | 
          "googleapis-master/google/logging/*" |
          "googleapis-master/google/longrunning/*" |
          "googleapis-master/google/rpc/*" |
          "googleapis-master/google/type/*"
        ),
        toDirectory=resourceManaged.value)
  }
}

libraryDependencies += "com.trueaccord.scalapb" %% "scalapb-runtime" %
  com.trueaccord.scalapb.compiler.Version.scalapbVersion % "protobuf"