1

我有一个 proto 文件product.proto,我想在catalog.proto. 我可以成功导入product.protocatalog.proto但自动生成catalog.pb.go的无法重新调整其依赖项的路径,即product.pb.go. 它指出:


无法导入目录/pb/entities(在 /usr/local/go/src/catalog/pb/entities(来自 $GOROOT) /Users/trimulabs/go/src/中找不到包“catalog/pb/entities”目录/pb/entities(来自 $GOPATH))

目录结构

catalog
 ┣ main
 ┃ ┣ client.go
 ┃ ┗ server.go
 ┣ pb
 ┃ ┣ entities
 ┃ ┃ ┣ product.pb.go
 ┃ ┃ ┗ product.proto
 ┃ ┣ catalog.pb.go
 ┃ ┗ catalog.proto

目录.proto

syntax = "proto3";
package catalog;
import "catalog/pb/entities/product.proto";

service CatalogService {
    rpc PostProduct (PostProductRequest) returns (PostProductResponse) {}
    rpc GetProduct (GetProductRequest) returns (GetProductResponse) {}
    rpc GetProducts (GetProductsRequest) returns (GetProductsResponse) {}
}

产品.proto

message Product {
    string id = 1;
    string name = 2;
    string description = 3;
    double price = 4;
}
message PostProductRequest {
    string name = 1;
    string description = 2;
    double price = 3;
}
message PostProductResponse {
    Product product = 1;
}

message GetProductRequest {
    string id = 1;
}

message GetProductResponse {
    Product product = 1;
}

message GetProductsRequest {
    uint64 skip = 1;
    uint64 take = 2;
    repeated string ids = 3;
    string query = 4;
}

message GetProductsResponse {
    repeated Product products = 1;
}

有人可以帮忙吗?

4

1 回答 1

1

您看到的错误是因为您生成的 protobuf 文件可能具有不正确的导入路径。

如果你检查你的product.pb.go文件,它可能有类似的内容:

import "catalog/pb/entities"

这意味着它正在尝试使用该指定路径导入 go 包。正如您可能熟悉的那样,go 包必须使用绝对路径,所以这需要看起来像:

import "github.com/<myuser>/<myproject>/catalog/pb/entities"

protoc-gen-go幸运的是支持几个标志来帮助你。

步骤 1.go_package在您的文件中设置.proto以指定预期的导入路径。

option go_package = "example.com/foo/bar";

第 2 步:使用 的--go_opt=module=github.com/<myuser>/<project>标志protoc从生成的代码中去除模块前缀。否则你会得到这样的输出(假设你使用当前目录作为你的go_out路径

catalog/
  main/
  pb/
  github.com/
    <myuser>/
      <project>/
        catalog/
          pb/
            entities/

我建议查看protoc-gen-gogo flags 上的文档页面:

于 2021-02-24T20:49:00.950 回答