Привлечение сторонних.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 говорит о том, что получение зависимостей из сети невозможно. Размещение копий в собственном проекте - это правильный путь.

Другие вопросы по тегам