Wii
Wii
发布于 2025-08-26 / 11 阅读
0
0

Protobuf 仓库支持多目标语言的实现思路

背景

在业务系统中,多语言混合的工程架构是常态,服务之间使用 IDL (Interactive Data Language) 实现进行多语言的目标代码生成、数据的通讯是当前的主流方式。

在近些年的开发实践中,主要接触 Protobuf 和 Flatbuffers,Protobuf 使用更为广泛,这里以 Protobuf 为例,讲述下协议管理与跨语言目标代码生成的实践经验。

目标代码生成

C++ 代码

对于 C++ 代码,由于需要编译 Protobuf 源码,通常顺带编译二进制工具,故写了一个 Protobuf Generator 的工具类,来实现在应用协议库时进行即时编译的方式来生成 C++ 代码,并在编译程序时添加目标代码一起编译。

Kung Fu Panda Protocols 协议库 提供了完整的示例。

Protobuf Generator (C++) ,就不粘贴代码了,这里是使用的示例。

generate_protobuf_message(
  SRCS
  PB_SRCS
  HEADERS
  PB_HEADERS
  OUTPUT
  ${PROJECT_BINARY_DIR}/gen/protobuf/cpp
  IMPORT
  ${PROJECT_SOURCE_DIR}/
  FILES
  ${PB_SOURCE_FILES})

Go 语言代码

由于在 Golang 项目中通常会使用 gRPC,故需要使用 protoc-gen-go 和 protoc-gen-go-grpc 两个插件,这需要依赖 Go 环境。同样是在 CMake 工具文件中定义 generate_protobuf_message_go,用于生成 Go 目标语言代码。同时支持指定两个代码生成插件的安装,以及支持指定插件版本,以应对不同的 Go 版本。

为了更方便地生成 Go 代码,定义 Makefile。

gen-go:
	@rm -rf "$(GEN_PATH)"
	@cmake --preset=release -DGEN_GO=ON
	@cp -r $(GEN_PATH)/*  go/

运行 make gen-go即可。

这个流程让实习生集成到了 Gitlab 的 CI/CD Pipline 中,合并协议即会触发目标代码生成,并打新的 tag。


评论