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 協議》,轉載必須註明作者和本文連結