Wwweixiao 2020-10-19 09:49 采纳率: 10%
浏览 58

ptotoc如何导入其他proto

图片说明
使用google自带的其他proto没问题,但是使用自己的proto有问题,提示找不到文件,然后执行
protoc --go_out=plugins=grpc:. -I=proto/sysuser ./proto/sysuser/*.proto

提示./proto/sysuser/*.proto: No such file or directory

单一编译是可以的
protoc --go_out=plugins=grpc:. -I=proto/sysuser ./proto/sysuser/sysuser.proto
这个要如何处理啊,求大神指教

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 02:34
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用Go语言和Google Protocol Buffers (protobuf) 时,如果你尝试从外部导入你的自定义协议文件(例如sysuser.proto),并且遇到了找不到文件的问题,你可以按照以下步骤解决:

    步骤1:确保你的包路径正确

    首先确认你正在使用的-I参数设置的是正确的包路径。通常情况下,这个路径应指向包含proto/sysuser目录的所有子目录。

    如果您的-I参数是正确的,但仍然遇到问题,请检查以下几点:

    • 确保您的系统环境变量GOPATH中包含了您想要访问的包路径。
    • 如果您已经设置了GO111MODULE, 那么确保它被正确地添加到你的PATH环境中。

    步骤2:指定依赖关系

    如果您想要将一个自定义协议添加到已有的依赖包中,可以考虑将您的自定义协议添加到依赖项中。这可以通过在.proto文件中添加相应的注释来实现,类似于下面的例子所示:

    syntax = "proto3";
    package my_custom_package;
    
    option go_package = "my_custom_package";
    
    // Import any proto to use.
    // Note: This import statement is optional and can be removed if not needed.
    // option google.protobuf.any_option = "optional";
    
    message MyCustomMessage {
        string field_one = 1;
    }
    

    在这个例子中,我们引入了任何可能需要的任何protobuf包,并且声明了一个名为"MyCustomMessage"的自定义消息类型。

    步骤3:使用protoc工具进行编译

    为了使你的自定义协议生效,你需要运行protoc工具并指定相应的配置文件。以下是使用protoc命令的完整示例:

    protoc --go_out=. -I=proto/my_custom_package ./proto/my_custom_package/*.proto
    

    这里,--go_out=选项用于指定输出格式为.go文件,而-I选项用于指定包含所有.proto文件的包路径。

    注意:protoc工具默认会生成.proto文件而不是.go文件,因此我们需要手动指定转换过程。

    步骤4:验证你的自定义协议是否成功导入

    在使用自定义协议之前,确保所有的服务和方法都能正常工作。通过创建一个简单的测试程序来验证你的自定义协议的功能性。

    package main
    
    import (
    	"context"
    	"log"
    
    	"github.com/grpc-ecosystem/go-grpc-middleware"
    	"github.com/grpc-ecosystem/go-grpc-prometheus"
    	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    	"google.golang.org/grpc/codes"
    	"google.golang.org/grpc/status"
    )
    
    func main() {
    	ctx := context.Background()
    
    	mux, err := runtime.NewServeMux(
    		runtime.FromUnaryHandler(func(ctx context.Context, req interface{}) error {
    			log.Printf("Received request: %v", req)
    			return nil
    		}),
    		runtime.FromGRPCServerInterceptor(grpc_prometheus.ServerTraceInterceptor()),
    		runtime.FromHTTPServerInterceptor(grpc_prometheus.ServerTimingInterceptor()),
    	)
    	if err != nil {
    		log.Fatalf("Failed to create server mux: %v", err)
    	}
    
    	lis, err := net.Listen("tcp", ":50051")
    	if err != nil {
    		log.Fatalf("Failed to listen on port: %v", err)
    	}
    	defer lis.Close()
    
    	if err := grpc_prometheus.Register(mux); err != nil {
    		log.Fatalf("Failed to register prometheus metrics: %v", err)
    	}
    
    	if err := runtime.Serve(mux, lis); err != nil {
    		log.Fatalf("Failed to serve: %v", err)
    	}
    }
    

    在这个例子中,我们在服务器端注册了prometheus监控器,以便在请求处理过程中收集性能指标。现在你可以运行你的服务,看看是否能看到这些性能指标。

    总结来说,解决找不到文件的问题的关键在于确保你的包路径设置正确,以及正确地指定你的依赖关系。此外,确保你的自定义协议符合protobuf规范,且与现有的服务兼容。希望这对你有所帮助!

    评论

报告相同问题?