使用Buf CLI生成Go代码时,如何导入其他目录/仓库的Proto文件?
解决buf generate跨目录/跨仓库导入Proto文件的问题
当然可以导入同一仓库不同目录或其他仓库的Proto文件,问题出在buf的模块配置和导入路径处理上,以下是具体解决步骤:
一、同一仓库内跨目录导入的解决方案
1. 确认仓库目录结构
你的仓库层级应该类似这样:
repository/ ├── common/ │ └── proto/ │ └── def/ │ └── error/ │ └── v1/ │ └── error.proto └── service/ └── proto/ └── def/ ├── buf.gen.yaml └── service/ └── v1/ └── service.proto
2. 在仓库根目录创建buf.yaml
buf基于模块工作,必须在仓库根定义模块配置,让buf能识别所有Proto文件的位置。创建repository/buf.yaml,内容如下:
version: v1 name: buf.build/organization/repository breaking: use: - FILE lint: use: - DEFAULT
3. 修改service.proto的导入路径
buf的导入路径是相对于模块根的路径,而非Go的模块路径。把原来的完整Go路径导入改为相对路径:
syntax = "proto3"; option go_package = "github.com/organization/repository/service/proto/gen/service/v1;servicev1"; package service.v1; // 改为相对模块根的路径 import "common/proto/def/error/v1/error.proto";
4. 调整buf.gen.yaml配置(可选但推荐)
建议把buf.gen.yaml移到仓库根目录,生成路径更清晰,配置修改为:
version: v1 plugins: - name: go out: . opt: module=github.com/organization/repository - name: go-grpc out: . opt: require_unimplemented_servers=false,module=github.com/organization/repository
5. 执行buf generate
在仓库根目录执行命令:
buf generate
如果一定要在service/proto/def目录执行,需指定模块根路径:
cd service/proto/def buf generate ../..
二、跨仓库导入的解决方案
如果要导入其他仓库的Proto文件,需使用buf的依赖管理:
- 在仓库根的
buf.yaml中添加依赖:
version: v1 name: buf.build/organization/repository dependencies: - buf.build/other-org/other-repo # 替换为目标仓库的buf模块名 breaking: use: - FILE lint: use: - DEFAULT
- 拉取依赖:
buf mod update
- 在Proto文件中使用依赖模块的导入路径,比如:
import "other/repo/path/error.proto"; # 替换为目标文件在依赖模块中的相对路径
- 执行
buf generate即可生成包含依赖的代码。
内容的提问来源于stack exchange,提问作者Harun Sasmaz
相关产品推荐
相关产品推荐

