我有两个位于不同文件路径的原始文件 ->
path1/a.proto 路径2/b.proto
我使用命令:
protoc --decode="packagename" path1/a.proto < dump.pb > dump.txt
输出文件无法正确解码(位置而不是属性名称)->
a.proto 文件在其导入部分导入 b.proto 文件。仍然面临这个问题。有办法解决这个问题吗?
我尝试在protoc的官方文档上寻找这个问题,但找不到解决方案。
可能最好通过一个例子来解释:
我们对 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
引用。此后(!)我们必须根据这些引用包范围的 protobuf,即--proto_path
。${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"
}
注意
- 参考两个
,就像我们生成源代码一样proto_path
是完全限定的--decode
名称package.Message
- 引用完全限定的文件路径
packagex.proto