如何解决.NET 5:找不到导入或有错误
从众所周知的入门示例(https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-3.1&tabs=visual-studio)派生的简单场景。为了使HelloRequest
消息可重复使用,我将其提取到另一个文件- request.proto 中。该文件与原始 greet.proto 位于同一文件夹中(请参见最后的图片)。
我需要让HelloRequest
服务(在 greet.proto 中)知道Greeter
(在 request.proto 中)。所有尝试将其导入greet.proto的尝试均失败,并显示以下消息
...
1>Protos/greet.proto(7,1): error : Import "request.proto" was not found or had errors.
...
这是greet.proto
syntax = "proto3";
option csharp_namespace = "GrpcService1";
package greeter;
import "request.proto";
//import "Protos/request.proto";
//import "GrpcService1/Protos/request.proto";
// all other combinations I may have thought off...
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
/*message HelloRequest {
string name = 1;
}*/
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
和request.proto:
syntax = "proto3";
package greeter; // needles to say this was commented out in all my attempts
message HelloRequest {
string name = 1;
}
解决方法
正如我期望的那样,答案和问题一样简单– 这只是一个幸运的猜测! –导入应类似于
import "protos/request.proto";
显然,protobuf编译器“认为”它在项目的根文件夹中运行。那是有道理的。
更多说明-如果导入的文件定义了新的程序包名称,则该名称应在消息名称前加上前缀,例如:
request.proto:
package common;
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
并在greet.proto中使用它:
package greet;
import "protos/request.proto";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (common.HelloRequest) returns (HelloReply);
}
请注意常见。HelloRequest。
这种简单的观察导致一个更普遍的问题(也许是一个更重要的问题)。
如何导入另一个项目(如CustomTypes.csproj)中定义的原型,以便将其(重新)用于多个gRPC原型IDL中?
我对此没有答案–太多的Unix ...:(
如果有人知道,请在此处发布。我很高兴为此投票。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。