ScalaPB不处理第三方依赖关系的下载,但它很容易让SBT为你下载并告诉ScalaPB构建下载的protos。
以下示例build.sbt
定义了一个extractProtos
任务,它将链接的主分支下载为github中的zip文件并将其提取。在做任何事之前,它会检查目标目录是否不存在,以防止每次编译时反复下载zip。
由于这里有很多原型,我们过滤zip文件。源根目录被提取到target/scala-2.12/resource_managed/googleapis-master
,我们将其添加到,因此当protoc被调用时,它会处理这些文件。
您可以在src/main/protobuf
中添加更多来源,并让他们获得"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"
很好的答案!我只需要两个.proto文件(api/annotations.proto,api/http.proto)。离开bigtable/admin/v2/*是否安全? – akauppi
是的,只留下你需要的东西,这只是一个例子。 – thesamet