2017-05-31 6 views
1

Wie kann ich ScalaPB sagen, dass es .proto Abhängigkeiten aus dem Internet abrufen sollte, z.Bringen Sie .proto Dateien von Drittanbietern zu ScalaPB

google/api/annotations.proto von https://github.com/googleapis/googleapis/tree/master/google/api

Hintergrund:

Ziel ist ETCD v3 API von Scala, über gRPC zu lesen.

Ich habe die etcd spezifische .proto Dateien von ihrem Projekt ausgewählt und unter meinen platziert. Es klappt. Die Abhängigkeiten fangen jedoch an, tief zu laufen, und es muss einen besseren Weg geben.

https://github.com/googleapis/googleapis/tree/master/google/api

Antwort

3

ScalaPB kann keine Abhängigkeiten von Drittanbietern herunterladen, aber es ist ziemlich einfach, SBT diese für Sie herunterzuladen und ScalaPB mitzuteilen, dass die heruntergeladenen Protos erstellt werden sollen.

Das folgende Beispiel build.sbt definiert eine extractProtos Task, die den Masterzweig des Repos herunterlädt, mit dem Sie als Zip-Datei verknüpft sind, aus Github und extrahiert es. Bevor Sie etwas tun, überprüft es, ob das Zielverzeichnis nicht existiert, um zu verhindern, dass die ZIP-Datei bei jedem Kompilieren immer wieder heruntergeladen wird.

Da es viele Protos gibt, filtern wir die Zip-Datei. Der Quellstamm wird in target/scala-2.12/resource_managed/googleapis-master extrahiert, den wir zu PB.protocSources in Compile hinzufügen. Wenn Protoc aufgerufen wird, verarbeitet es diese Dateien.

Sie können weitere Quellen in src/main/protobuf hinzufügen und haben sie "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" 
+0

Große Antwort! Ich brauche nur zwei .proto Dateien (api/annotations.proto, api/http.proto). Ist es sicher, den BigTable/admin/v2/* zu verlassen? – akauppi

+1

Ja, lass nur was du brauchst, es war nur ein Beispiel. – thesamet

-1

A post auf der ScalaPB Mailing-Liste sagt, dass Abhängigkeiten von Online-Abrufen nicht möglich ist. Kopien in das eigene Projekt zu stellen, ist der richtige Weg.

Verwandte Themen