【问题标题】:How to load a .proto file in protoregistry如何在 protoregistry 中加载 .proto 文件
【发布时间】:2020-07-05 15:30:30
【问题描述】:

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

据我所知,我需要

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

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

【问题讨论】:

    标签: go reflection protocol-buffers


    【解决方案1】:

    如果其他人回答这个问题:

    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)
    }
    

    【讨论】:

    • 您能找到更简单的方法吗?我还希望 API 可以通过在运行时加载 proto 文件来更轻松地解码 protobuf 序列化消息。
    • @kentor,好吧,一旦我实现了答案中的代码,我就不再寻找了。
    • 您可以使用 jhump 的 protoparse 存储库以编程方式直接从 .proto 文件中解析 Go 代码:github.com/jhump/protoreflect
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多