2017-05-31 137 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告诉从网上获取的依赖是不可能的。将副本放在自己的项目中是正确的。