Невозможно использовать Google / API / аннотации - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь использовать REST over gRP C, используя аннотации Google API. К сожалению, я столкнулся с проблемой прото c, сообщающей мне, что annotations.proto не существует или имел ошибки. Я напрасно попробовал несколько исправлений.

Я даже попытался переустановить полный стек на случай, если что-то сделал не так. Я опишу вам как можно больше полных строк и файлов, которые я установил из моей установки fre sh.

Из установки fre sh go. Я набираю следующие строки оболочки:

$ mkdir sources/golang

$ echo 'export GOPATH=$HOME/sources/golang' >> $HOME/.zshrc

$ source ~/.zshrc

$ cd sources/golang

$ mkdir src

$ cd src

$ export PATH=$PATH:$GOPATH/bin

$ go get -u google.golang.org/grpc

$ go get -u github.com/golang/protobuf/protoc-gen-go

$ go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

$ go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

$ mkdir -p test/proto/test

$ cd test/proto/test

$ vim test.proto

В моем файле test.proto я написал очень простые c строки:

syntax = "proto3";

package main;

import "google/api/annotations.proto";

service Tester {
    rpc Test (Request) returns (Reply) {
        option (google.api.http) = { get: "/v1/test" };
    }
}

message Request {
    string Message = 1;
}

message Reply {
    string Message = 1;
}

Затем

$ cd $GOPATH/src

$ vim main.go

По моему. go, очень основы c тоже:

package main

import (
        tc "test/proto/test"
        "context"
        "fmt"
        "log"
        "net"

        grpc "google.golang.org/grpc"
        codes "google.golang.org/grpc/codes"
)

func main() {
        err := StartServer("tcp", "127.0.0.1:50051")
        if err != nil {
                fmt.Printf("Error!! %s", err)
        }
}

type Server struct {
        tc.UnimplementedTesterServer
}

func (s *Server) Test(ctx context.Context, in *tc.Request) (*tc.Reply, error) {
        return &tc.Reply{Message: ""}, nil
}

func StartServer(protocol string, port string) error {
        lis, err := net.Listen(protocol, port)
        if err != nil {
                fmt.Printf("failed to listen: %v", err)
        }
        s := grpc.NewServer()
        tc.RegisterTesterServer(s, &Server{})

        error := s.Serve(lis)

        if error != nil {
                fmt.Printf("failed to serve: %v", error)
                return error
        }

        return nil
}

Наконец, я пытаюсь скомпилировать мои прото-файлы:

$ protoc --proto_path=.:$GOPATH/src --go_out=plugins=grpc:. proto/*/*.proto

И у меня систематически возникает следующая ошибка:

proto/test/test.proto:5:1: Import "github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/google/api/annotations.proto" was not found or had errors.

Когда я вижу, что файлы получают go get ... они помещаются в $ GOPATH / pkg / mod /

Например, файл annotations.proto googleapis находится в: $ GOPATH / pkg / mod / github.com / grp c -ecosystem / grpc-gateway@v1.12.1/third_party/googleapis/google/api/annotations.proto* 1 077 *

Может быть, причина?

1 Ответ

2 голосов
/ 07 января 2020

Смешивание ваших команд protobuf и ваших команд go делает это более сложным, чем нужно. Просто сконцентрируйтесь на protobuf для обработки ошибки.

Вы импортируете "google / api / annotations.proto"

Ваш proto_path - --proto_path =.: $ GOPATH / sr c

Это означает, что при выполнении прото c файл должен находиться по адресу ./google/api/annotations.proto или $ GOPATH / src / google / api / annotations.proto

...