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


从错误信息来看,问题主要出在两个方面:

  1. go_package 路径格式不正确 - 需要包含至少一个斜杠
  2. 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 必须是完整的导入路径或包含斜杠的相对路径。按照上述修改后,代码生成应该能正常工作。

回到顶部