Привлечение сторонних.proto файлов в ScalaPB
Как я могу сказать ScalaPB, что он должен получить .proto
зависимости от Интернета, например
google/api/annotations.proto
со https://github.com/googleapis/googleapis/tree/master/google/api
Фон:
Цель - прочитать API etcd v3 из Scala через gRPC.
Я выбрал конкретный etcd .proto
файлы из их проекта, и размещены под моим. Оно работает. Однако зависимости начинают углубляться, и должен быть лучший способ.
https://github.com/googleapis/googleapis/tree/master/google/api
2 ответа
ScalaPB не обрабатывает загрузку сторонних зависимостей, но довольно легко заставить SBT загрузить их для вас и сказать ScalaPB создать загруженные прототипы.
Следующий образец build.sbt
определяет extractProtos
задача, которая загружает основную ветку репозитория, с которым вы связались, в виде zip-файла с github и извлекает его. Прежде чем что-либо делать, он проверяет, не существует ли целевой каталог, чтобы предотвратить загрузку архива снова и снова при каждой компиляции.
Так как там много протосов, мы фильтруем zip-файл. Исходный корень извлекается в target/scala-2.12/resource_managed/googleapis-master
к которому мы добавляем PB.protocSources in Compile
поэтому, когда вызывается 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"
Сообщение в списке рассылки ScalaPB говорит о том, что получение зависимостей из сети невозможно. Размещение копий в собственном проекте - это правильный путь.