如何在Makefile中同步gRPC Proto并保留客户端go_package配置
解决gRPC客户端proto保留go_package配置的Makefile方案
直接用sed结合文件操作就能搞定,下面给两种实用的实现方式:
方案一:精准替换服务端go_package行
先把服务端proto复制到客户端目录,再用sed替换掉服务端的option go_package配置:
# 假设服务端proto路径为../server/protos,客户端目标路径为./protos update-client-protos: # 批量处理所有proto文件 for proto_file in ../server/protos/*.proto; do \ # 提取纯文件名,避免路径冲突 filename=$$(basename $$proto_file); \ # 复制服务端proto到客户端目录 cp $$proto_file ./protos/$$filename; \ # 替换服务端的go_package为客户端专属配置 sed -i 's/option go_package = "\.\/;serverproto";/option go_package = "\.\/;clientproto";/' ./protos/$$filename; \ done
方案二:过滤+插入更灵活
如果服务端的go_package配置可能变动(比如路径修改),这种方式更稳妥:先过滤掉服务端proto里所有go_package相关行,再插入客户端自己的配置:
update-client-protos: for proto_file in ../server/protos/*.proto; do \ filename=$$(basename $$proto_file); \ # 过滤服务端的go_package行,写入客户端文件 grep -v 'option go_package' $$proto_file > ./protos/$$filename; \ # 在文件开头插入客户端的go_package配置(通常proto的option声明在开头) sed -i '1i option go_package = "./;clientproto";' ./protos/$$filename; \ done
注意事项
- 跨平台兼容:MacOS的
sed与GNUsed参数有差异,Mac下需用sed -i '' '...';若要统一环境,建议安装GNU sed(brew install gnu-sed),改用gsed命令。 - 备份机制:可在复制前添加
cp ./protos/$$filename ./protos/$$filename.bak,防止意外覆盖导致配置丢失。 - 位置调整:若你的
go_package习惯放在package声明之后,可先定位package行号再插入,比如用sed -n '/package/=' ./protos/$$filename获取行号后,用sed -i '行号a option go_package = "./;clientproto";'插入到下一行。
内容的提问来源于stack exchange,提问作者nakem
相关产品推荐
相关产品推荐

