登录
首页 >  Golang >  Go问答

加载 .proto 文件到 protoregistry 的方法

来源:stackoverflow

时间:2024-03-09 11:15:20 111浏览 收藏

哈喽!今天心血来潮给大家带来了《加载 .proto 文件到 protoregistry 的方法》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我需要简单地直接加载一些 .proto 文件的内容作为描述符,这样我就可以按照 https://pkg.go.dev/google.golang.org/protobuf/reflect/protoregistry 通过反射来操作它们

根据我所能收集到的信息,我需要

  1. 将文件内容作为字符串加载。
  2. 使用 prototext 将字符串解组为 descriptorpb.FileDescriptorProto
  3. 用它初始化 ProtoFileDescriptor
  4. 最后我可以在注册表中注册 ProtoFileDescriptor。

我真的需要跳过所有这些麻烦,还是我完全错过了另一个 API?


解决方案


如果其他人提出这个问题:

func registerProtoFile(src_dir string, filename string) error {
    // First, convert the .proto file to a file descriptor set
    tmp_file := filename + "tmp.pb"
    cmd := exec.Command("protoc", 
        "--descriptor_set_out=" + tmp_file, 
        "-I"+src_dir  
        path.Join(src_dir, filename))

    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err := cmd.Run()
    if err != nil {
        return err
    }

    defer os.Remove(tmp_file)

    // Now load that temporary file as a file descriptor set protobuf
    protoFile, err := ioutil.ReadFile(tmp_file)
    if err != nil {
        return err
    }

    pb_set := new(descriptorpb.FileDescriptorSet)
    if err := proto.Unmarshal(protoFile, pb_set); err != nil {
        return err
    }

    // We know protoc was invoked with a single .proto file
    pb := pb_set.GetFile()[0]

    // Initialize the File descriptor object
    fd, err := protodesc.NewFile(pb, protoregistry.GlobalFiles)
    if err != nil {
        return err
    }

    // and finally register it.
    return protoregistry.GlobalFiles.RegisterFile(fd)
}

到这里,我们也就讲完了《加载 .proto 文件到 protoregistry 的方法》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>