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