2017-05-31 79 views
1

如何告訴ScalaPB它應該從Internet獲取.proto依賴項,例如,將第三方.proto文件引入ScalaPB

google/api/annotations.protohttps://github.com/googleapis/googleapis/tree/master/google/api

背景:

目的是讀取來自Scala的ETCD V3 API,通過GRPC。

我已經從他們的項目中選擇了etcd特定的.proto文件,並放置在我的項目下。有用。然而,依賴性開始深入,必須有更好的方法。

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

回答

3

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" 
+0

很好的答案!我只需要兩個.proto文件(api/annotations.proto,api/http.proto)。離開bigtable/admin/v2/*是否安全? – akauppi

+1

是的,只留下你需要的東西,這只是一個例子。 – thesamet

-1

的ScalaPB郵件列表上post告訴從網上獲取的依賴是不可能的。將副本放在自己的項目中是正確的。