ScalaPBはサードパーティの依存関係のダウンロードを処理しませんが、SBTをダウンロードしてScalaPBにダウンロードされたprotosをビルドすることは非常に簡単です。
次のサンプルbuild.sbt
は、githubからzipファイルにリンクされたrepoのマスターブランチをダウンロードして抽出するタスクを定義します()。何かをする前に、コンパイルするたびにzipを何度もダウンロードしないように、ターゲットディレクトリが存在しないかどうかをチェックします。
そこには多数のprotoがあるので、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"
私は2つの.protoファイル(api/annotations.proto、api/http.proto)が必要です。 bigtable/admin/v2/*を残すことは安全ですか? – akauppi
はい、必要なものだけを残して、それは単なる例でした。 – thesamet