scalapb 生成的 proto 中的未知字段
Unknown fields in proto generated by scalapb
我是 scalapb 和 protobuf 的新手。
我正在尝试为我的 scalapb 生成器创建单元测试。我已经生成了原型文件并尝试在测试中使用它们。
我有这个原型文件:
syntax = "proto3";
package hellogrpc.calc;
import "google/api/annotations.proto";
option (scalapb.options) = {
flat_package: true
};
service CalcService {
rpc CalcSum (SumRequest) returns (CalcResponse) {
option (google.api.http) = {
post: "/calcService/sum"
body: "*"
};
}
}
有注释的方法CalcSum
以及对应生成的proto文件:
// Generated by the Scala Plugin for the Protocol Buffer Compiler.
// Do not edit!
//
// Protofile syntax: PROTO3
package hellogrpc.calc
object CalcServiceProto extends _root_.com.trueaccord.scalapb.GeneratedFileObject {
lazy val dependencies: Seq[_root_.com.trueaccord.scalapb.GeneratedFileObject] = Seq(
com.trueaccord.scalapb.scalapb.ScalapbProto,
com.google.api.annotations.AnnotationsProto
)
lazy val messagesCompanions: Seq[_root_.com.trueaccord.scalapb.GeneratedMessageCompanion[_]] = Seq(
hellogrpc.calc.SumRequest,
hellogrpc.calc.CalcResponse
)
private lazy val ProtoBytes: Array[Byte] =
com.trueaccord.scalapb.Encoding.fromBase64(scala.collection.Seq(
"""ChtoZWxsb2dycGMvQ2FsY1NlcnZpY2UucHJvdG8SDmhlbGxvZ3JwYy5jYWxjGhVzY2FsYXBiL3NjYWxhcGIucHJvdG8aHGdvb
2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8iKAoKU3VtUmVxdWVzdBIMCgFhGAEgASgFUgFhEgwKAWIYAiABKAVSAWIiJgoMQ2FsY
1Jlc3BvbnNlEhYKBnJlc3VsdBgBIAEoBVIGcmVzdWx0Mm8KC0NhbGNTZXJ2aWNlEmAKB0NhbGNTdW0SGi5oZWxsb2dycGMuY2FsY
y5TdW1SZXF1ZXN0GhwuaGVsbG9ncnBjLmNhbGMuQ2FsY1Jlc3BvbnNlIhuC0+STAhUiEC9jYWxjU2VydmljZS9zdW06ASpCBeI/A
hABYgZwcm90bzM="""
).mkString)
lazy val scalaDescriptor: _root_.scalapb.descriptors.FileDescriptor = {
val scalaProto = com.google.protobuf.descriptor.FileDescriptorProto.parseFrom(ProtoBytes)
_root_.scalapb.descriptors.FileDescriptor.buildFrom(scalaProto, dependencies.map(_.scalaDescriptor))
}
lazy val javaDescriptor: com.google.protobuf.Descriptors.FileDescriptor = {
val javaProto = com.google.protobuf.DescriptorProtos.FileDescriptorProto.parseFrom(ProtoBytes)
com.google.protobuf.Descriptors.FileDescriptor.buildFrom(javaProto, Array(
com.trueaccord.scalapb.scalapb.ScalapbProto.javaDescriptor,
com.google.api.annotations.AnnotationsProto.javaDescriptor
))
}
@deprecated("Use javaDescriptor instead. In a future version this will refer to scalaDescriptor.", "ScalaPB 0.5.47")
def de
```scriptor: com.google.protobuf.Descriptors.FileDescriptor = javaDescriptor
}
我在intellj idea中查看CalcServiceProto.javaDescriptor:
方法描述符具有以下原型定义:
name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
72295728: "\"0/calcService/sum:[=12=]1*"
}
但是发电机工作得很好!我调试生成器,在生成器上切换断点,方法 CalcSum 具有以下原型定义:
name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
[google.api.http] {
post: "/calcService/sum"
body: "*"
}
}
这可能是因为我没有像生成器那样注册扩展。
我希望通过任何方式通过此测试:
val s = CalcServiceProto.javaDescriptor.getServices.get(0)
val m = s.getMethods.get(0)
m.getOptions.getExtension(AnnotationsProto.http).getPost shouldBe "/calcService/sum"
如果您需要 Java 个可用的扩展程序,您需要生成启用 Java 个转换的代码。这将使 javaDescriptor 依赖官方 Java 实现,您的测试将通过。
当 Java 转换被禁用时,ScalaPB 解析描述符,但它不能保证 Java 扩展被编译,所以它不会尝试注册它们。
我想要的是 Scala 描述符在这种情况下可以工作,但是它们还不支持服务和方法。我提交了 https://github.com/scalapb/ScalaPB/issues/382 来跟踪这方面的进展。
与此同时,就像我上面写的那样,您可以使用 java 转换来强制 ScalaPB 为您提供 Java 描述符。在你的 build.sbt 中,有:
PB.targets in Compile := Seq(
scalapb.gen(grpc=true, javaConversions=true) -> (sourceManaged in Compile).value,
PB.gens.java -> (sourceManaged in Compile).value
)
我是 scalapb 和 protobuf 的新手。
我正在尝试为我的 scalapb 生成器创建单元测试。我已经生成了原型文件并尝试在测试中使用它们。
我有这个原型文件:
syntax = "proto3";
package hellogrpc.calc;
import "google/api/annotations.proto";
option (scalapb.options) = {
flat_package: true
};
service CalcService {
rpc CalcSum (SumRequest) returns (CalcResponse) {
option (google.api.http) = {
post: "/calcService/sum"
body: "*"
};
}
}
有注释的方法CalcSum
以及对应生成的proto文件:
// Generated by the Scala Plugin for the Protocol Buffer Compiler.
// Do not edit!
//
// Protofile syntax: PROTO3
package hellogrpc.calc
object CalcServiceProto extends _root_.com.trueaccord.scalapb.GeneratedFileObject {
lazy val dependencies: Seq[_root_.com.trueaccord.scalapb.GeneratedFileObject] = Seq(
com.trueaccord.scalapb.scalapb.ScalapbProto,
com.google.api.annotations.AnnotationsProto
)
lazy val messagesCompanions: Seq[_root_.com.trueaccord.scalapb.GeneratedMessageCompanion[_]] = Seq(
hellogrpc.calc.SumRequest,
hellogrpc.calc.CalcResponse
)
private lazy val ProtoBytes: Array[Byte] =
com.trueaccord.scalapb.Encoding.fromBase64(scala.collection.Seq(
"""ChtoZWxsb2dycGMvQ2FsY1NlcnZpY2UucHJvdG8SDmhlbGxvZ3JwYy5jYWxjGhVzY2FsYXBiL3NjYWxhcGIucHJvdG8aHGdvb
2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8iKAoKU3VtUmVxdWVzdBIMCgFhGAEgASgFUgFhEgwKAWIYAiABKAVSAWIiJgoMQ2FsY
1Jlc3BvbnNlEhYKBnJlc3VsdBgBIAEoBVIGcmVzdWx0Mm8KC0NhbGNTZXJ2aWNlEmAKB0NhbGNTdW0SGi5oZWxsb2dycGMuY2FsY
y5TdW1SZXF1ZXN0GhwuaGVsbG9ncnBjLmNhbGMuQ2FsY1Jlc3BvbnNlIhuC0+STAhUiEC9jYWxjU2VydmljZS9zdW06ASpCBeI/A
hABYgZwcm90bzM="""
).mkString)
lazy val scalaDescriptor: _root_.scalapb.descriptors.FileDescriptor = {
val scalaProto = com.google.protobuf.descriptor.FileDescriptorProto.parseFrom(ProtoBytes)
_root_.scalapb.descriptors.FileDescriptor.buildFrom(scalaProto, dependencies.map(_.scalaDescriptor))
}
lazy val javaDescriptor: com.google.protobuf.Descriptors.FileDescriptor = {
val javaProto = com.google.protobuf.DescriptorProtos.FileDescriptorProto.parseFrom(ProtoBytes)
com.google.protobuf.Descriptors.FileDescriptor.buildFrom(javaProto, Array(
com.trueaccord.scalapb.scalapb.ScalapbProto.javaDescriptor,
com.google.api.annotations.AnnotationsProto.javaDescriptor
))
}
@deprecated("Use javaDescriptor instead. In a future version this will refer to scalaDescriptor.", "ScalaPB 0.5.47")
def de
```scriptor: com.google.protobuf.Descriptors.FileDescriptor = javaDescriptor
}
我在intellj idea中查看CalcServiceProto.javaDescriptor:
方法描述符具有以下原型定义:
name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
72295728: "\"0/calcService/sum:[=12=]1*"
}
但是发电机工作得很好!我调试生成器,在生成器上切换断点,方法 CalcSum 具有以下原型定义:
name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
[google.api.http] {
post: "/calcService/sum"
body: "*"
}
}
这可能是因为我没有像生成器那样注册扩展。
我希望通过任何方式通过此测试:
val s = CalcServiceProto.javaDescriptor.getServices.get(0)
val m = s.getMethods.get(0)
m.getOptions.getExtension(AnnotationsProto.http).getPost shouldBe "/calcService/sum"
如果您需要 Java 个可用的扩展程序,您需要生成启用 Java 个转换的代码。这将使 javaDescriptor 依赖官方 Java 实现,您的测试将通过。
当 Java 转换被禁用时,ScalaPB 解析描述符,但它不能保证 Java 扩展被编译,所以它不会尝试注册它们。
我想要的是 Scala 描述符在这种情况下可以工作,但是它们还不支持服务和方法。我提交了 https://github.com/scalapb/ScalaPB/issues/382 来跟踪这方面的进展。
与此同时,就像我上面写的那样,您可以使用 java 转换来强制 ScalaPB 为您提供 Java 描述符。在你的 build.sbt 中,有:
PB.targets in Compile := Seq(
scalapb.gen(grpc=true, javaConversions=true) -> (sourceManaged in Compile).value,
PB.gens.java -> (sourceManaged in Compile).value
)