生成Protobuf的Go代码(20240918更新)

  • SDN/VNF
  • 1,985 clicked

Protobuf生成Go代码插件

1. 安装protoc

  1. 首先protoc --version 查询本机版本。假设从protoc2更换到protoc3.
  2. 在官方Githubhttps://github.com/protocolbuffers/protobuf/下载地址找相应版本的源码。
    发布版本见链接https://github.com/protocolbuffers/protobuf/releases

    wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.7.1.zip
    unzip v3.7.1.zip -d ./

    window下载地址示例: https://github.com/protocolbuffers/protobuf/releases/download/v25.4/protoc-25.4-win64.zip

  3. 删除本机的protoc,例如
    sudo rm -rf /usr/local/include/google/protobuf
  4. 根据1步骤中下载源码的Readme进行安装。
    cd ${your path}
    ./autogen.sh  生成configure文件
    ./configure --prefix=/usr
    make 
    # make check
    sudo make install
    sudo ldconfig # refresh shared library cache.

    注意,其中第二行命令可以通过--prefix指定地址。但是我嫌麻烦就没弄  ↵
    至此,protoc --version已经变成了3.7.1

  5. 假设需要从protoc3再变回protoc2,需要重复1,2,3步骤(别忘了下载需要的2.8.0版本)。
  6. 如果还要换回protoc3,注意,只需要完成第2步,和第3步中的最后两行命令即可。同样的,从protoc3换回protoc2也是一样的操作。
    sudo make install
    sudo ldconfig # refresh shared library cache.
  7. 以上一系列操作,不要删除编译的源码,否则需要重复第3步全部代码,很费时间。

2. Protobuf生成Go代码插件

$ export GO111MODULE=on  # Enable module mode
#这里需要确保${GOPATH}/bin位于环境变量path中
$ echo ${GOPATH}
$ export PATH=${PATH}:${GOPATH}/bin
# 可以指定版本下载二进制工具
#go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1
#go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0

go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

#在所在项目中,执行以下命令可指定版本
protoc --go_out=. --go-grpc_out=. xxx.proto

3. 执行脚本

生成该目录下所有.proto文件为对应.go文件代码

#!/usr/bin/env bash
set -eo pipefail

PROTO_RELATIVE_PATH="."
protodirs=$(find "${PROTO_RELATIVE_PATH}" -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq)
for dir in ${protodirs}; do
    #$(find "${dir}" -maxdepth 1 -name '*.proto')  
    protofiles="${dir}/*.proto"
    echo "generating pb ${protofiles}"
    protoc --go_out=../../../.. \
        --go-grpc_out=../../../.. ${protofiles}
done

发表评论

邮箱地址不会被公开。 必填项已用*标注