cosmos-sdk/proto/bank/v1beta1/query.proto编译错误求助
问题
安装protoc 3.21.12后,在路径cosmos-sdk/proto/cosmos/bank/v1beta1下执行命令protoc --go_out=. query.proto时,出现大量导入文件未找到及类型未定义错误。已确认导入文件路径正确,且更换过不同cosmos-sdk版本,问题仍存在,期望该命令能无错误执行。错误详情如下:
saiful@saiful-Inspiron-3542:~/Desktop/TestCosmos/cosmos-sdk/proto/cosmos/bank/v1beta1$ protoc --go_out=. query.proto cosmos/base/query/v1beta1/pagination.proto: File not found. gogoproto/gogo.proto: File not found. google/api/annotations.proto: File not found. cosmos/base/v1beta1/coin.proto: File not found. cosmos/bank/v1beta1/bank.proto: File not found. cosmos_proto/cosmos.proto: File not found. cosmos/query/v1/query.proto: File not found. amino/amino.proto: File not found. query.proto:4:1: Import "cosmos/base/query/v1beta1/pagination.proto" was not found or had errors. query.proto:5:1: Import "gogoproto/gogo.proto" was not found or had errors. query.proto:6:1: Import "google/api/annotations.proto" was not found or had errors. query.proto:7:1: Import "cosmos/base/v1beta1/coin.proto" was not found or had errors. query.proto:8:1: Import "cosmos/bank/v1beta1/bank.proto" was not found or had errors. query.proto:9:1: Import "cosmos_proto/cosmos.proto" was not found or had errors. query.proto:10:1: Import "cosmos/query/v1/query.proto" was not found or had errors. query.proto:11:1: Import "amino/amino.proto" was not found or had errors. query.proto:135:3: "cosmos.base.v1beta1.Coin" is not defined. query.proto:147:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:159:12: "cosmos.base.v1beta1.Coin" is not defined. query.proto:167:3: "cosmos.base.query.v1beta1.PageResponse" is not defined. query.proto:182:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:191:12: "cosmos.base.v1beta1.Coin" is not defined. query.proto:199:3: "cosmos.base.query.v1beta1.PageResponse" is not defined. query.proto:223:3: "cosmos.base.v1beta1.Coin" is not defined. query.proto:235:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:242:12: "cosmos.base.v1beta1.Coin" is not defined. query.proto:252:3: "cosmos.base.query.v1beta1.PageResponse" is not defined. query.proto:264:3: "cosmos.base.v1beta1.Coin" is not defined. query.proto:273:3: "Params" is not defined. query.proto:279:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:286:12: "Metadata" is not defined. query.proto:289:3: "cosmos.base.query.v1beta1.PageResponse" is not defined. query.proto:302:3: "Metadata" is not defined. query.proto:313:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:326:3: "cosmos.base.v1beta1.Coin" is not defined. query.proto:336:3: "cosmos.base.query.v1beta1.PageResponse" is not defined. query.proto:347:3: "cosmos.base.query.v1beta1.PageRequest" is not defined. query.proto:354:12: "SendEnabled" is not defined. query.proto:357:3: "cosmos.base.query.v1beta1.PageResponse" is not defined.
解决方法
1. 正确指定Proto根路径
protoc无法自动识别依赖文件的位置,必须用--proto_path(简写-I)参数指定所有依赖的根目录。由于query.proto中的导入路径是基于cosmos-sdk/proto目录的,你需要把这个目录设为根路径:
- 若当前在
cosmos-sdk/proto/cosmos/bank/v1beta1目录下,执行:
protoc --go_out=. --proto_path=../../../../ query.proto
这里的../../../../对应回到cosmos-sdk/proto目录的相对路径。
- 更简单的方式是先切换到
cosmos-sdk/proto目录再执行命令:
cd ~/Desktop/TestCosmos/cosmos-sdk/proto protoc --go_out=. cosmos/bank/v1beta1/query.proto
2. 补充外部依赖的Proto文件路径
错误中提到的gogoproto、google/api、amino等外部依赖的proto文件,需要让protoc能找到它们:
- 先通过Go模块下载这些依赖:
go get github.com/gogo/protobuf/proto go get google.golang.org/genproto/googleapis/api go get github.com/cosmos/cosmos-sdk/amino
- 执行protoc时,把这些依赖的proto目录加入
--proto_path:
protoc --go_out=. \ --proto_path=./ \ --proto_path=$GOPATH/src/github.com/gogo/protobuf \ --proto_path=$GOPATH/src/google.golang.org/genproto/googleapis \ --proto_path=$GOPATH/src/github.com/cosmos/cosmos-sdk/amino \ cosmos/bank/v1beta1/query.proto
(注:$GOPATH需替换为你本地的Go工作目录路径)
3. 使用Cosmos-SDK官方生成工具
Cosmos-SDK提供了现成的Makefile脚本,自动处理所有依赖路径和生成规则,避免手动执行的麻烦。直接在Cosmos-SDK根目录执行:
make proto-gen
这个命令会自动生成所有proto文件对应的Go代码,包括bank/v1beta1下的文件。
内容的提问来源于stack exchange,提问作者Md. Saiful Islam
相关产品推荐
相关产品推荐

