协议:在 service.proto 中导入未解决

protoc: import in service.proto not resolved

我有一个项目,其中 service 定义位于消息定义的单独文件中。协议不喜欢这样:

Execution failed for task ':generateProto'.
> protoc: stdout: . stderr: IAscIndication.proto:11:13: "AscIndication" is not defined.
  IAscIndication.proto:11:37: "AscResponse" is not defined.

(从 gradle 调用协议)。

这是不应该做的事情还是我们设置中的问题或 protoc (3.19.4) 中的错误?当我将两个文件合并为一个文件时它会起作用。

有问题的文件:

IAscIndication.proto

syntax = "proto3";

import "Asc.proto";

package com.tyntec.hades.v1;
option java_multiple_files = true;
option java_package = "com.tyntec.hades.grpc";

service IAscIndication
{
    rpc Asc(AscIndication) returns (AscResponse) {}
}

Asc.proto

syntax = "proto3";

import "BaseTypes.proto";

package tyntec.hades.v1;
option java_multiple_files = true;
option java_package = "com.tyntec.hades.grpc";

message AscRequest
{
    SignalOutbound      meta            = 1;
    AscRequestData      data            = 2;
}

message AscIndication
{
    SignalInbound       meta            = 1;
    AscRequestData      data            = 2;
}

这是从 bash 调用时的命令行和错误:

> /home/martinsc/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protoc/3.19.4/99ed7588824cb00e0db4f1b215e7d4c69d00e74b/protoc-3.19.4-linux-x86_64.exe -I/home/martinsc/java/mt/acheron/src/main/proto -I/home/martinsc/java/mt/acheron/build/extracted-protos/main -I/home/martinsc/java/mt/acheron/build/extracted-include-protos/main --java_out=/home/martinsc/java/mt/acheron/src/generated/main/java --plugin=protoc-gen-grpc=/home/martinsc/.gradle/caches/modules-2/files-2.1/io.grpc/protoc-gen-grpc-java/1.44.1/5d42eec0c997038e3a131dea05ad9f5be37992cb/protoc-gen-grpc-java-1.44.1-linux-x86_64.exe --grpc_out=/home/martinsc/java/mt/acheron/src/generated/main/grpc /home/martinsc/java/mt/acheron/src/main/proto/Asc.proto /home/martinsc/java/mt/acheron/src/main/proto/BaseTypes.proto /home/martinsc/java/mt/acheron/src/main/proto/Error.proto /home/martinsc/java/mt/acheron/src/main/proto/IAscIndication.proto
IAscIndication.proto:11:13: "AscIndication" is not defined.
IAscIndication.proto:11:37: "AscResponse" is not defined.

系统是Ubuntu20.4.

这是因为包裹不匹配(可能是拼写错误)。为了包含另一个文件,它们要么需要在同一个包中,要么您需要在协议中使用 -I 选项。

因此,在您的情况下,您可能需要将 Asc.proto 包更改为:

package com.tyntec.hades.v1;

或将您的 IAscIndication.proto 更改为:

package tyntec.hades.v1;

如果不想换包,有两种可能:

  • 尝试像这样 运行 协议:
protoc -I. [your_other_options] *.proto
  • 在 rpc 端点中使用完全限定名称
rpc Asc(tyntec.hades.v1.AscIndication) returns (tyntec.hades.v1.AscResponse) {}