Golang如何从proto文件生成代码
Golang如何从proto文件生成代码 我正在尝试从proto文件在pb目录(我已创建)中生成代码。我使用的命令如下:
protoc --proto_path=proto proto/*.proto --go_out=pb --go-grpc_out=pb
我遇到了错误:
2021/03/18 11:34:46 WARNING: Deprecated use of 'go_package' option without a full import path in "laptop_service.proto", please specify:
option go_package = ".;pb";
A future release of protoc-gen-go will require the import path be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
protoc-gen-go-grpc: invalid Go import path "pb" for "keyboard.proto"
The import path must contain at least one forward slash ('/') character.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
--go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.
在proto文件中,我有:
option go_package = "pb";
我哪里做错了?
更多关于Golang如何从proto文件生成代码的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
正如错误信息所示,你的
go_package选项必须至少包含一个正斜杠 (/)。 尝试类似这样的写法:
option go_package = "./pb";或option go_package = "/pb";
更多关于Golang如何从proto文件生成代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
从错误信息来看,问题主要出在两个方面:
- go_package 路径格式不正确 - 需要包含至少一个斜杠
- protoc-gen-go 版本兼容性问题 - 新版本要求完整的导入路径
解决方案:
1. 修改 proto 文件中的 go_package 选项
在你的 proto 文件中,将:
option go_package = "pb";
改为:
option go_package = "your_module_name/pb";
或者使用相对路径格式:
option go_package = "./pb";
2. 更新 protoc 命令
使用以下命令格式:
protoc --proto_path=proto proto/*.proto \
--go_out=pb \
--go_opt=paths=source_relative \
--go-grpc_out=pb \
--go-grpc_opt=paths=source_relative
3. 完整示例
假设你的项目结构如下:
your_project/
├── go.mod
├── proto/
│ ├── laptop_service.proto
│ └── keyboard.proto
└── pb/
proto/laptop_service.proto 示例:
syntax = "proto3";
package laptop;
option go_package = "github.com/yourusername/your_project/pb";
service LaptopService {
rpc CreateLaptop(CreateLaptopRequest) returns (CreateLaptopResponse);
}
message CreateLaptopRequest {
string id = 1;
string brand = 2;
}
message CreateLaptopResponse {
string id = 1;
}
生成命令:
protoc --proto_path=proto proto/*.proto \
--go_out=pb \
--go_opt=paths=source_relative \
--go-grpc_out=pb \
--go-grpc_opt=paths=source_relative
4. 如果你使用的是旧版 protoc-gen-go
确保安装了正确版本的插件:
# 安装 protoc-gen-go 和 protoc-gen-go-grpc
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go-grpc@latest
# 验证版本
protoc-gen-go --version
protoc-gen-go-grpc --version
5. 替代方案:使用 Makefile
创建 Makefile 简化生成过程:
PROTO_DIR=proto
OUT_DIR=pb
gen:
protoc --proto_path=$(PROTO_DIR) $(PROTO_DIR)/*.proto \
--go_out=$(OUT_DIR) \
--go_opt=paths=source_relative \
--go-grpc_out=$(OUT_DIR) \
--go-grpc_opt=paths=source_relative
然后运行:
make gen
主要问题在于新版本的 protoc-gen-go 要求 go_package 必须是完整的导入路径或包含斜杠的相对路径。按照上述修改后,代码生成应该能正常工作。

