将第三方.proto文件带到ScalaPB

时间:2017-05-31 10:26:54

标签: protocol-buffers scalapb

如何告诉ScalaPB它应该从互联网上获取.proto个依赖关系,例如

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

google/api/annotations.proto

背景:

目的是通过gRPC从Scala中读取etcd v3 API。

我从他们的项目中选择了etd特定的.proto文件,并放在我的下面。有用。但是,依赖关系开始深入,并且必须有更好的方法。

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

2 个答案:

答案 0 :(得分:4)

ScalaPB不处理第三方依赖的下载,但是很容易让SBT为你下载它们并告诉ScalaPB构建下载的protos。

以下示例build.sbt定义了一个extractProtos任务,它将您链接到的repo的主分支作为zip文件从github下载并提取它。在做任何事情之前,它会检查目标目录是否不存在,以防止每次编译时反复下载zip。

由于那里有很多protos,我们过滤了zip文件。源根被提取到target/scala-2.12/resource_managed/googleapis-master,我们将PB.protocSources in Compile添加到src/main/protobuf,因此当调用protoc时,它会处理这些文件。

您可以在"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"

.about {
  clear: both;
}

and

.work {
  float:left;
  width:100%;
}

答案 1 :(得分:-1)

ScalaPB邮件列表上的post表示无法从在线获取依赖关系。将副本放在一个人自己的项目中是正确的方法。