如何使用protoc命令解码多个文件?

问题描述 投票:0回答:1

我有两个位于不同文件路径的原始文件 ->

path1/a.proto 路径2/b.proto

我使用命令:

protoc --decode="packagename" path1/a.proto < dump.pb > dump.txt

输出文件无法正确解码(位置而不是属性名称)->

在此输入图片描述

a.proto 文件在其导入部分导入 b.proto 文件。仍然面临这个问题。有办法解决这个问题吗?

我尝试在protoc的官方文档上寻找这个问题,但找不到解决方案。

protocol-buffers decode protoc
1个回答
0
投票

可能最好通过一个例子来解释:

我们对 2 个不同的 protobuf 路径(

path1
path2
)进行建模,每个路径都包含一个不同的包(
packagex
packagey
),其名称类似的 protobuf(见下文)

.
├── path1
│   └── packagex
│       └── packagex.proto
└── path2
    └── packagey
        └── packagey.proto

地点:

packagex.proto

syntax = "proto3";

package packagex;

import "packagey/packagey.proto";

// Replace {MODULE} with you go module path
option go_package="{MODULE}/packagex";

message P1 {
    string id = 1;
    packagey.P2 p2 = 2; 
}

packagey.proto

syntax = "proto3";

package packagey;

// Replace {MODULE} with you go module path
option go_package="{MODULE}/packagey";

message P2 {
    string id = 1;
}

packagex
包含
P1
定义为包含(导入)
packagey.P2

我们可以编译为 Go 源代码:

MODULE="..." # Your Go module path

PATH1=${PWD}/path1
PATH2=${PWD}/path2

protoc \
--proto_path=${PATH1} \
--proto_path=${PATH2} \
--go_out=${PWD} \
--go_opt=module=${MODULE} \
--go-grpc_out=${PWD} \
--go-grpc_opt=module=${MODULE} \
${PATH1}/packagex/packagex.proto \
${PATH2}/packagey/packagey.proto

注意 有 2 个不同的 protobuf 路径(

path1
path2
),必须明确
--proto_path
引用。此后(!)我们必须根据这些引用包范围的 protobuf,即
${PATH2}/packagey/packagey.proto

产量:

.
├── packagex
│   └── packagex.pb.go
├── packagey
│   └── packagey.pb.go
├── path1
│   └── packagex
│       └── packagex.proto
└── path2
    └── packagey
        └── packagey.proto

注意 生成的 Go 源代码不引用 protobuf 路径,但保留对包的引用。这是用户定义的行为。

生成示例消息文件:

package main

import (
    "log/slog"
    "os"

    "github.com/DazWilkin/stackoverflow/79101420/packagex"
    "github.com/DazWilkin/stackoverflow/79101420/packagey"
    "google.golang.org/protobuf/proto"
)

func main() {
    p1 := &packagex.P1{
        Id: "foo",
        P2: &packagey.P2{
            Id: "bar",
        },
    }
    m, err := proto.Marshal(p1)
    if err != nil {
        slog.Error("unable to marshall message", "err", err)
    }

    slog.Info("Message", "m", m)
    if err := os.WriteFile("p1.pb", m, 0644); err != nil {
        slog.Error("unable to write file", "err", err)
    }
}

产量

p1.pb

0a03666f6f12050a03626172

最后:

protoc \
--proto_path=${PATH1} \
--proto_path=${PATH2} \
--decode=packagex.P1 \
${PATH1}/packagex/packagex.proto < p1.pb
id: "foo"
p2 {
  id: "bar"
}

注意

  1. 参考两个
    proto_path
    ,就像我们生成源代码一样
  2. --decode
    是完全限定的
    package.Message
    名称
  3. 引用完全限定的文件路径
    packagex.proto
© www.soinside.com 2019 - 2024. All rights reserved.