无法使用google/API/annotations

无法使用google/API/annotations,go,protocol-buffers,grpc,protoc,Go,Protocol Buffers,Grpc,Protoc,我尝试使用谷歌api注释通过gRPC使用REST。 不幸的是,我面临一个proto问题,告诉我annotations.proto不存在或有错误。 我尝试了几次修复,但都没有成功 我甚至试图重新安装一个完整的堆栈,以防我做错了什么。 我将尽可能详细地向您介绍我从新安装中设置的完整行和文件 从新安装的VM中,我键入以下shell行: $mkdir来源/golang $echo'export GOPATH=$HOME/sources/golang'>>$HOME/.zshrc $source~/.zs

我尝试使用谷歌api注释通过gRPC使用REST。 不幸的是,我面临一个proto问题,告诉我annotations.proto不存在或有错误。 我尝试了几次修复,但都没有成功

我甚至试图重新安装一个完整的堆栈,以防我做错了什么。 我将尽可能详细地向您介绍我从新安装中设置的完整行和文件

从新安装的VM中,我键入以下shell行:

$mkdir来源/golang

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

$source~/.zshrc

$cd来源/戈兰

$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测试/协议/测试

$cd测试/原型/测试

$vim test.proto

在我的test.proto文件中,我写了非常基本的行:

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

在我的main.go中,也非常基本:

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
}
最后,我尝试编译我的proto文件:

$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.
当我看到文件get by go get…,它们被放在$GOPATH/pkg/mod下/

例如,googleapis的annotations.proto文件位于:$GOPATH/pkg/mod/github.com/grpc-econosystem/grpc下-gateway@v1.12.1/第三方/googleapis/google/api/annotations.proto


可能是因为这个原因吧?

把protobuf命令和go命令混在一起会使事情变得更加复杂。只需关注protobuf来处理错误

您正在导入google/api/annotations.proto

您的proto_路径是-proto_路径=。:$GOPATH/src


这意味着,当您执行protoc时,您应该将文件放在./google/api/annotations.proto或$GOPATH/src/google/api/annotations.proto中。proto将protobuf命令和go命令混合在一起会使这变得更加复杂。只需关注protobuf来处理错误

您正在导入google/api/annotations.proto

您的proto_路径是-proto_路径=。:$GOPATH/src


因此,这意味着当您执行protoc时,您应该将文件放在./google/api/annotations.proto或$GOPATH/src/google/api/annotations.proto上。我遇到了同样的问题,我正在尝试自动化一个解决方案,该解决方案可以在任何Linux上运行,并且依赖性尽可能少

各国的官方文件:

您需要向protoc编译器提供所需的第三方protobuf文件。它们包含在本回购协议的第三方/googleapis文件夹下,我们建议将它们复制到protoc生成文件结构中。如果您已经根据类似于Buf样式指南的内容构建了原型文件,那么您可以将这些文件复制到顶级/google文件夹中

换句话说:以某种方式下载它并使其工作

另外,由于这段引用也是原始源代码中的一段引用,因此不太明显,这使得我在头两次阅读时跳过了它,寻找解决方案,这是不好的

因此,正如我在@SeanF answer的评论中所指出的那样,使用go-get不是一个可维护的选项,因为它将项目保存在一个名称包含最新版本的文件夹中,当版本更改时,这将导致维护困难

因此,最好的选择实际上是克隆grpc网关项目:

git克隆https://github.com/grpc-ecosystem/grpc-gateway protoc-I grpc网关/\ -I grpc网关/第三方/googleapis\ -外出=插件=grpc:。proto/*/*.proto 我还用我的解决方案写了一个要点,它只依赖于docker和bash,因此应该是稳定的:

它有一个问题,我使用go.mod,但每次执行后都会丢弃它,这是不好的。但是现在它已经足够好了,它可能会对一些人有所帮助


关于

我也遇到了同样的问题,我正在尝试自动化一个解决方案,该解决方案可以在任何Linux上运行,并且依赖性尽可能少

各国的官方文件:

您需要向protoc编译器提供所需的第三方protobuf文件。它们包含在本回购协议的第三方/googleapis文件夹下,我们建议将它们复制到protoc生成文件结构中。如果您已经根据类似于Buf样式指南的内容构建了原型文件,那么您可以将这些文件复制到顶级/google文件夹中

换句话说:以某种方式下载它并使其工作

另外,由于这段引用也是原始源代码中的一段引用,因此不太明显,这使得我在头两次阅读时跳过了它,寻找解决方案,这是不好的

所以,正如我就评论所争论的那样 对于@SeanF answer,使用go-get不是一个可维护的选项,因为它将项目保存在一个名称包含最新版本的文件夹中,当版本更改时,这将导致维护困难

因此,最好的选择实际上是克隆grpc网关项目:

git克隆https://github.com/grpc-ecosystem/grpc-gateway protoc-I grpc网关/\ -I grpc网关/第三方/googleapis\ -外出=插件=grpc:。proto/*/*.proto 我还用我的解决方案写了一个要点,它只依赖于docker和bash,因此应该是稳定的:

它有一个问题,我使用go.mod,但每次执行后都会丢弃它,这是不好的。但是现在它已经足够好了,它可能会对一些人有所帮助

关于

gRPC网关v2.3.0已删除第三方文件夹,请参阅

以下是一些可能有效的解决方案:

解决方案1:

从protoc切换到buf

如果您使用的是Buf,则需要将以下行添加到Buf.yaml文件中,直接位于版本标记下方:

名称:buf.build/yourorg/myprotos 副署长: -buf.build/beta/googleapis 此外,在向buf.yaml添加依赖项后,必须始终运行buf beta mod update

问题是您使用了太多的破折号。所以你需要出去。但这类事情对于Buf来说更容易一些

解决方案2:

使用旧版本。gRPC网关gRPC网关v2.3.0已删除第三方文件夹,请参阅

以下是一些可能有效的解决方案:

解决方案1:

从protoc切换到buf

如果您使用的是Buf,则需要将以下行添加到Buf.yaml文件中,直接位于版本标记下方:

名称:buf.build/yourorg/myprotos 副署长: -buf.build/beta/googleapis 此外,在向buf.yaml添加依赖项后,必须始终运行buf beta mod update

问题是您使用了太多的破折号。所以你需要出去。但这类事情对于Buf来说更容易一些

解决方案2:


使用旧版本。gRPC网关哦,谢谢!你让我开心。有一个问题存在,我做了一个符号链接,把它放在我的src文件夹中,有没有更好的方法来实现这一点?除非使用$GOPATH/pkg/mod/github.com/grpc-econosystem/grpc设置整个路径-gateway@v1.12.1/第三方/googleapis/,使用更通用的命令?有很多方法可以设置。如果你对谷歌软件项目结构感兴趣,你会对有多少不同的推荐感到不知所措,这取决于语言、工具、平台、功能和品味。使用符号链接很好。我会将go和proto文件分开,我会将protobuf文件放在它们自己的目录树中,并使用protoc命令将go语言输出文件写入GOPATH中的正确位置,以使用go编译器编译它们。@SeanF解决@cyriz提到的问题。不是关于项目结构,而是关于使用go-get下载这些依赖项。问题是:如果最新版本从1.12.1更改为其他版本,会发生什么情况?另一个程序员必须理解它并创建一个新的符号链接?应该有一种方法可以引用这些文件,而不依赖最新版本的路径。我不能说我有解决这个问题的办法,如果每两个月左右我就必须回来,因为版本已经改变了。哦,谢谢!你让我开心。有一个问题存在,我做了一个符号链接,把它放在我的src文件夹中,有没有更好的方法来实现这一点?除非使用$GOPATH/pkg/mod/github.com/grpc-econosystem/grpc设置整个路径-gateway@v1.12.1/第三方/googleapis/,使用更通用的命令?有很多方法可以设置。如果你对谷歌软件项目结构感兴趣,你会对有多少不同的推荐感到不知所措,这取决于语言、工具、平台、功能和品味。使用符号链接很好。我会将go和proto文件分开,我会将protobuf文件放在它们自己的目录树中,并使用protoc命令将go语言输出文件写入GOPATH中的正确位置,以使用go编译器编译它们。@SeanF解决@cyriz提到的问题。不是关于项目结构,而是关于使用go-get下载这些依赖项。问题是:如果最新版本从1.12.1更改为其他版本,会发生什么情况?另一个程序员必须理解它并创建一个新的符号链接?应该有一种方法可以引用这些文件,而不依赖最新版本的路径。我不能说我有解决这个问题的办法,如果每两个月左右我就必须回来,因为版本已经改变了。