如何告诉ScalaPB它应该从互联网上获取.proto
个依赖关系,例如
google/api/annotations.proto
背景:
目的是通过gRPC从Scala中读取etcd v3 API。
我从他们的项目中选择了etd特定的.proto
文件,并放在我的下面。有用。但是,依赖关系开始深入,并且必须有更好的方法。
https://github.com/googleapis/googleapis/tree/master/google/api
答案 0 :(得分:4)
ScalaPB不处理第三方依赖的下载,但是很容易让SBT为你下载它们并告诉ScalaPB构建下载的protos。
以下示例build.sbt
定义了一个extractProtos
任务,它将您链接到的repo的主分支作为zip文件从github下载并提取它。在做任何事情之前,它会检查目标目录是否不存在,以防止每次编译时反复下载zip。
由于那里有很多protos,我们过滤了zip文件。源根被提取到target/scala-2.12/resource_managed/googleapis-master
,我们将PB.protocSources in Compile
添加到src/main/protobuf
,因此当调用protoc时,它会处理这些文件。
您可以在"import "google/rpc/..."
中添加更多来源,并将其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"
。
.about {
clear: both;
}
and
.work {
float:left;
width:100%;
}
答案 1 :(得分:-1)
ScalaPB邮件列表上的post表示无法从在线获取依赖关系。将副本放在一个人自己的项目中是正确的方法。