protobuf 編譯工具安裝與使用

pibigstar發表於2020-01-19

1.1 下載Go

wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
# 解壓
tar -zxvf go1.13.4.linux-amd64.tar.gz

1.2 配置go環境

編輯 /etc/profile 檔案

vim ~/.bashrc

將下面內容加入到末尾(GOPAT是我Windows中的GOPATH)

export GOROOT=/usr/local/go
export GOPATH=/home/pibigstar/goWork
export PATH=$GOPATH/bin:$PATH
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

2.1 安裝protoc

去這個網址下載:https://github.com/protocolbuffers/protobuf/releases,根據自己的系統,下載對應的檔案
解壓:

unzip protoc.zip 

將bin資料夾下的 protoc 複製到Linux 中的 /bin目錄下

sudo cp protoc/bin/protoc /bin/protoc

執行 protoc -verson 如果輸出版本資訊則證明配置成功

2.2 安裝protoc-gen-go

# 下載
git clone https://github.com/golang/protobuf.git
# 進入目錄
cd protobuf/protoc-gen-go
# 編譯
go install

2.3 安裝protoc-gen-validate

這個是用來生成pb的校驗規則檔案,也就是*.pb.validate.go

go get -u github.com/envoyproxy/protoc-gen-validate

2.4 安裝protoc-gen-doc

這個是用來生成 proto 的文件檔案,會生成一個 html 格式的文件, 下載地址:https://github.com/pseudomuto/protoc-gen-d...

wget https://github.com/pseudomuto/protoc-gen-doc/releases/download/v1.3.0/protoc-gen-doc-1.3.0.windows-amd64.go1.11.2.tar.gz
# 解壓
tar -zxvf protoc-gen-doc-1.3.0.windows-amd64.go1.11.2.tar.gz

2.5 安裝proto-gen-java

可在這個地址下載 protoc-gen-java工具,https://repo1.maven.org/maven2/io/grpc/pro... ,記得把檔名改為protoc-gen-grpc-java

3.1 hello.proto

syntax="proto3";

package main;

message Hello {
    string value = 1;
}

3.2 編譯

3.2.1 編譯為Go程式碼(protoc-gen-go)

protoc --go_out=plugins=grpc,paths=source_relative:. --validate_out="lang=go,paths=source_relative:." hello.proto

注意

  • paths引數
    使用 source_relative 則不會使用option go_package中指定的路徑
    使用 import 則是使用option go_package 中指定的路徑

3.2.2 編譯為Java程式碼 (protoc-gen-java)

可在這個地址下載 protoc-gen-java工具,https://repo1.maven.org/maven2/io/grpc/pro... ,記得把檔名改為protoc-gen-grpc-java

protoc --java_out=. --grpc-java_out=. hello.proto

3.2.3 生成proto文件(proto-gen-doc)

protoc --doc_out=. --doc_opt=html,index.html:Ignore* hello.proto user.proto

3.3 複雜點的proto

syntax="proto3";

//生成的pb檔案中package為admin
package admin;

//生成go檔案的路徑
option go_package          = "pb/admin";
//關閉Java多檔案
option java_multiple_files = false;
//生成的Java檔案的package路徑
option java_package        = "pb.admin";

service UserService {
    rpc Login(LoginReq) returns (LoginResp);
}

message LoginReq {
    string username = 1;
    string password = 2;
}

message LoginResp {
    int32 code = 1;
    string msg = 2;
}

3.4 編譯指令碼

#!/usr/bin/env bash

TARGET="../"

if [ -n "$1" ]; then
    TARGET=$1
fi

# 排除掉 extra/src 目錄
for file in `find . -path ./extra/src -prune -o -name '*.proto' -print`;
do
    echo $file
    protoc -I=extra/src:. --go_out=plugins=grpc,paths=import:$TARGET --validate_out="lang=go,paths=import:$TARGET" $file
done

歡迎關注我微信公眾號,一起來學習Go語言

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章