版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第基于go微服務(wù)效率工具goctl深度解析目錄前言一、goctl的由來(lái)1.goctl的誕生2.為什么需要goctl?3.怎么理解開發(fā)規(guī)范?4.怎么理解工程效率?二、goctl的安裝及功能介紹1.介紹2.安裝goget/installdocker3.功能介紹goctlcompletiongoctlmigrategoctlenv環(huán)境查看修改參數(shù)依賴檢測(cè)/安裝goctlrpc編輯器插件三、goctl使用中遇到的問題1.386架構(gòu)上安裝goctl失敗!2.grpc到底安裝什么版本插件?3.錯(cuò)誤提升4.Nohelptopicproto5.zrpc生成代碼時(shí)報(bào)go_package錯(cuò)誤6.zrpc生成代碼時(shí)指定了pb的輸出目錄為當(dāng)前服務(wù)main目錄7.為什么我的代碼生成的pbclient(不)帶client標(biāo)志?8.為什么我生成的目錄結(jié)構(gòu)和文檔演示不一樣?9.為什么我安裝了goctl編輯器插件還是不能高亮
前言
本文根據(jù)安前松的視頻分享整理而來(lái),視頻回放地址如下:
/video/BV1Hr
一、goctl的由來(lái)
1.goctl的誕生
goctl的最早功能是為了解決GRPC內(nèi)網(wǎng)調(diào)試問題,大約是在2025年,在我們的生產(chǎn)環(huán)境中,rpc是內(nèi)網(wǎng)隔離的,不可通過外網(wǎng)訪問,為了快速去mock一些線上RPCclient的請(qǐng)求,就簡(jiǎn)單的實(shí)現(xiàn)了第一版本的代碼生成,主要目的是去訪問RPCServer做一些調(diào)試。
2.為什么需要goctl?
降低溝通成本
溝通,是團(tuán)隊(duì)協(xié)作進(jìn)行信息交換的一種形式,溝通的方式有很多種,會(huì)議溝通、文檔溝通、聊天交流,相信不管是哪種方式,溝通都是團(tuán)隊(duì)中最難的一個(gè)環(huán)節(jié),會(huì)議溝通需要占用大量時(shí)間,動(dòng)則半小時(shí)起步,文檔溝通同樣,也會(huì)占據(jù)大量時(shí)間去構(gòu)思和編寫大篇幅的文檔,最后可能還沒表達(dá)出預(yù)期目標(biāo),線上聊天,需要雙方都在線上才能進(jìn)行信息交換,當(dāng)然我們這里溝通交換的信息更多是指開發(fā)中的一些內(nèi)容,如接口信息、部署信息等。
降低團(tuán)隊(duì)耦合
有了溝通,那么團(tuán)隊(duì)之間的協(xié)作的耦合是避免不了的,例如:在前后端開發(fā)中,最大的耦合是接口的耦合,前端完成了規(guī)定UI繪制后,需要等待后端的接口部署到對(duì)應(yīng)環(huán)境才能實(shí)現(xiàn)功能的調(diào)試,在此期間,前端的團(tuán)隊(duì)資源就會(huì)大大浪費(fèi),由此還會(huì)導(dǎo)致項(xiàng)目的延期等問題。
提高開發(fā)效率
除了溝通成本和團(tuán)隊(duì)耦合以外,每個(gè)團(tuán)隊(duì)在進(jìn)行項(xiàng)目開發(fā)時(shí)也有很多時(shí)間是在做重復(fù)的工作,例如:我們?cè)陂_發(fā)一個(gè)新的功能時(shí),需要去定義接口,編寫接口文檔,編碼準(zhǔn)備工作,業(yè)務(wù)開發(fā),model文件,編寫Dockerfile文件,編寫k8syaml文件,在這些上面我們可以在每個(gè)環(huán)節(jié)上都有提升的空間,讓用戶將真正的時(shí)間集中在業(yè)務(wù)開發(fā)上。
降低錯(cuò)誤率
在之前的開發(fā)實(shí)踐中,經(jīng)常會(huì)出現(xiàn)grpcserver實(shí)現(xiàn)不完全的問題,grpcserver實(shí)現(xiàn)類經(jīng)常會(huì)出現(xiàn)編譯不過的情況;除此之外,數(shù)據(jù)庫(kù)查詢層代碼開發(fā),sql語(yǔ)句的編寫多參,少參,參數(shù)錯(cuò)位,在編譯過程中很難發(fā)現(xiàn),一般可能到QA環(huán)節(jié)才能發(fā)現(xiàn),更甚者會(huì)導(dǎo)致線上問題。
3.怎么理解開發(fā)規(guī)范?
開發(fā)規(guī)范,包括編碼規(guī)范,工程規(guī)范,提交規(guī)范,代碼審核規(guī)范,部署規(guī)范等等,團(tuán)隊(duì)內(nèi)如果將開發(fā)規(guī)范統(tǒng)一起來(lái),其收益可想而知,舉個(gè)例子:假如你所在的公司沒有統(tǒng)一開發(fā)規(guī)范,這時(shí)需要你去做一些跨部門協(xié)作或者支持,煥然一新的開發(fā)環(huán)境讓你望而卻步,還沒開始就有了抵觸的念頭,這豈不是違背了支持的初衷。
4.怎么理解工程效率?
工程效率,要理解工程效率,可以先看看『效率』的定義:
效率是指單位時(shí)間內(nèi)完成的工作量
效率的目標(biāo)是快,但快并不是效率,換句話說就是在單位時(shí)間內(nèi)完成的高質(zhì)量工作,這才是我們要追求的目標(biāo),那么工程效率就是為了『縮短從開發(fā)到線上的距離』
二、goctl的安裝及功能介紹
1.介紹
goctl定義
goctl定義,準(zhǔn)確說是定位吧,可以理解為一個(gè)代碼生成腳手架,其核心思想是通過對(duì)DSL進(jìn)行語(yǔ)法解析、語(yǔ)義分析到數(shù)據(jù)驅(qū)動(dòng)實(shí)現(xiàn)完成代碼生成功能,旨在幫助開發(fā)者從工程效率角度提高開發(fā)者的開發(fā)效率。
解決的問題
提高開發(fā)效率:goctl的代碼生成覆蓋了Go、Java、Android、iOS、TS等多門語(yǔ)言,通過goctl可以一鍵生成各端代碼,讓開發(fā)者將精力集中在業(yè)務(wù)開發(fā)上。降低溝通成本:使用zero-api替代API文檔,各端以zero-api為中心生成各端代碼,無(wú)需再通過會(huì)議、API文檔來(lái)進(jìn)行接口信息傳遞。降低耦合度:在之前的開發(fā)實(shí)踐中,沒有g(shù)octl之前,我們采用的是傳統(tǒng)的API文檔來(lái)作為接口信息傳遞的載體,然后通過會(huì)議來(lái)進(jìn)行二次review,我們都知道,前端開發(fā)工作中,除了UI的繪制外就是UI聯(lián)調(diào),如果比較積極的前端開發(fā)者,可能會(huì)自己利用一些腳手架或者自己mock一些數(shù)據(jù)去進(jìn)行UI聯(lián)調(diào),反之,也有原地等待后端部署后再聯(lián)調(diào)的case,原因是自己寫mock數(shù)據(jù)太耗時(shí),也不想去動(dòng),如果前端的開發(fā)進(jìn)度在后端之前,那么在后端部署到環(huán)境中這期間,前端只能安靜的原地等待,這不僅是一種資源的浪費(fèi),也會(huì)造成項(xiàng)目進(jìn)度的延期,有了zero-api,前端可以利用goctl去生成適量的mock數(shù)據(jù)來(lái)進(jìn)行UI聯(lián)調(diào)。發(fā)展歷史
goctl發(fā)展歷史可以大概的過一下,挑幾個(gè)標(biāo)志性的功能講講吧!
首先是goctlrpc,goctlrpc的第一版本就是goctl的雛形,主要是為了生成client代碼對(duì)rpc做調(diào)試使用,具體就不展開了。goctlrpc的發(fā)展經(jīng)過了很多曲折,印象比較深刻的應(yīng)該算goctlrpcproto向goctlrpcprotoc的轉(zhuǎn)變,這期間為了解決很多問題,才做了相應(yīng)的變更,具體細(xì)節(jié)在分享rpc代碼生成使用那塊再詳細(xì)分享,在這里面其實(shí)對(duì)我來(lái)說印象最深刻的一個(gè)功能算是goctlmodel了,其算是我開始維護(hù)goctl的一個(gè)入手點(diǎn)吧,也是我從業(yè)務(wù)開發(fā)實(shí)踐中挖掘的解決方案吧,終究我還是比較懶,記得在當(dāng)時(shí)開發(fā)一個(gè)業(yè)務(wù)模塊,由于業(yè)務(wù)比較大,需要?jiǎng)?chuàng)建的數(shù)據(jù)表也很多,在沒有g(shù)octl前都是自己去手動(dòng)編碼完成,這一塊我記憶猶新,花了僅一天的時(shí)間來(lái)寫model文件,因?yàn)槲覜]有用orm的習(xí)慣,所以這塊sql完全是裸sql語(yǔ)句,服務(wù)跑起來(lái)后才發(fā)現(xiàn)有很多sql傳參上的錯(cuò)誤,基本都是多參少參問題,除此之外,每次新增索引,或者字段變更,緩存的相關(guān)邏輯維護(hù)也讓我十分頭疼,于是結(jié)合當(dāng)時(shí)的開發(fā)最佳實(shí)踐,將其按照緩存與否把這塊的工作交給了goctl,第一版本goctlmodel生成主要是網(wǎng)頁(yè)版本,后面陸續(xù)集成到goctl里了,這給我后續(xù)開發(fā)帶來(lái)了很大的開發(fā)效率收益。
展望未來(lái)
goctl集成了比較多的功能,其基本是以代碼生成為主,開發(fā)規(guī)范為輔,goctl是圍繞zero-api為中心做代碼生成的,因此在將來(lái),zero-api的建設(shè)會(huì)成為我們的重心:
ast的改造:替換原有比較重的antlr4,可以解決很多人安裝goctl時(shí)內(nèi)存不夠,系統(tǒng)架構(gòu)不支持的各種問題,這goctlmock的支持,最大限度解耦各端依賴耦合
2.安裝
Goctl安裝有兩種方式,分別是goget或者goinstall,其次是docker。
goget/install
#Go1.16之前版本
$GO111MODULE=onGOPROXY=/,directgoget-u/zeromicro/go-zero/tools/goctl@latest
#Go1.16及以后版本
$GOPROXY=/,directgoinstall/zeromicro/go-zero/tools/goctl@latest
#macOS
$brewinstallgoctl
$goctl--version
goctlversion1.3.5darwin/amd64
#查看goctl
$cd$GOPATH/binls|grep"goctl"
如果執(zhí)行g(shù)octl--version提示commandnotfound:goctl的錯(cuò)誤,請(qǐng)先排查$GOBIN是否在環(huán)境變量下。
docker
#1.pull
$dockerpullkevinwan/goctl
#2.ls
$dockerimagels|grep"goctl"
kevinwan/goctllatest7fd46843de3d5weeksago383MB
#3.run
$dockerrun-itkevinwan/goctl/bin/sh
3.功能介紹
我們接下來(lái)看看功能介紹,通過指令goctl--help可以列出我們當(dāng)前已經(jīng)支持的功能,可能大家在看文檔時(shí)也沒有專心下來(lái)對(duì)這塊指令做研究,只是用到一些高頻指令,今天既然是goctl的專題分享,我們就花點(diǎn)時(shí)間來(lái)一起過過,帶著大家從0到1熟悉goctl。
$goctl--help
Aclitooltogenerateapi,zrpc,modelcode
Usage:
goctl[command]
AvailableCommands:
apiGenerateapirelatedfiles
bugReportabug
completionGeneratetheautocompletionscriptforthespecifiedshell
dockerGenerateDockerfile
envCheckoreditgoctlenvironment
helpHelpaboutanycommand
kubeGeneratekubernetesfiles
migrateMigratefromtal-techtozeromicro
modelGeneratemodelcode
quickstartquicklystartaproject
rpcGeneraterpccode
templateTemplateoperation
upgradeUpgradegoctltolatestversion
Flags:
-h,--helphelpforgoctl
-v,--versionversionforgoctl
Use"goctl[command]--help"formoreinformationaboutacommand.
goctl的功能比較豐富,所以難免指令參數(shù)比較多,大家在使用時(shí)除了看文檔外,也善用--help這個(gè)flag,因?yàn)樗麜?huì)告訴你每個(gè)指令或者子指令的用法,需要什么參數(shù),參數(shù)類型是字符串還是布爾,是必填還是可選,切不可自己猜測(cè)他應(yīng)該用什么flag,雖然goctl是我自己主要維護(hù),其實(shí)很多時(shí)候,有些指令比較文檔,沒有太多feature去更新,我也記不住,我也是通過--help去查看功能介紹的
goctlcompletion
查看goctl版本
$goctl--version
goctlversion1.3.5darwin/amd64
1.3.5
本節(jié)內(nèi)容僅適合goctl版本在1.3.5及之前的的自動(dòng)補(bǔ)全設(shè)置參考,1.3.5版本及之前僅支持類Unix操作系統(tǒng),不支持Windows的自動(dòng)補(bǔ)全,1.3.5之后的請(qǐng)?zhí)^此節(jié)內(nèi)容
執(zhí)行g(shù)octlcompletion-h查看使用說明
$goctlcompletion--help
NAME:
goctlcompletion-generationcompletionscript,itonlyworksforunix-likeOS
USAGE:
goctlcompletion[commandoptions][arguments...]
OPTIONS:
--namevalue,-nvaluethefilenameofautocompletescript,defaultis[goctl_autocomplete]
根據(jù)幫助說明得知,goctlcompletion支持通過--name傳遞一個(gè)參數(shù)生成自動(dòng)補(bǔ)全腳本文件名,但該參數(shù)為非必填,默認(rèn)不填時(shí)為goctl_autocomplete文件,其位于$GOCTLHOME目錄下。
執(zhí)行g(shù)octlcompletion來(lái)生成自動(dòng)補(bǔ)全腳本
$goctlcompletion
generationautocompletionsuccess!
executesthefollowingscripttosettingshell:
echoPROG=goctlsource/Users/keson/.goctl/.auto_complete/zsh/goctl_autocomplete~/.zshrcsource~/.zshrc
echoPROG=goctlsource/Users/keson/.goctl/.auto_complete/bash/goctl_autocomplete~/.bashrcsource~/.bashrc
查看當(dāng)前shell
$echo$SHELL
/bin/zsh
選擇對(duì)應(yīng)shell的腳本執(zhí)行,我這里為zsh,所以執(zhí)行指令如下
$echoPROG=goctlsource/Users/keson/.goctl/.auto_complete/zsh/goctl_autocomplete~/.zshrcsource~/.zshrc
重啟終端驗(yàn)證結(jié)果
#鍵入goctl后按下tab鍵查看自動(dòng)補(bǔ)全提示
$goctl#tab
api--generateapirelatedfiles
bug--reportabug
completion--generationcompletionscript,itonlyworksforunix-likeOS
docker--generateDockerfile
env--checkoreditgoctlenvironment
helph--Showsalistofcommandsorhelpforonecommand
kube--generatekubernetesfiles
migrate--migratefromtal-techtozeromicro
model--generatemodelcode
rpc--generaterpccode
template--templateoperation
upgrade--upgradegoctltolatestversion
1.3.6
本節(jié)內(nèi)容僅適合goctl版本在1.3.6及之后的的自動(dòng)補(bǔ)全設(shè)置參考,1.3.6之前的請(qǐng)?zhí)^此節(jié)內(nèi)容
如果你是從1.3.5升級(jí)到1.3.6及以后,則需要執(zhí)行如下指令來(lái)清除舊版本自動(dòng)補(bǔ)全配置,這里以zsh為例子,否則請(qǐng)?zhí)^這一步
#編輯~/.zshrc
$vim~/.zshrc
#找到PROG=goctl所在行并刪除
#source
$source~/.zshrcrm.zcompdump*
#重啟終端
執(zhí)行g(shù)octlcompletion-h查看使用說明,從使用幫助中可以查看到目前支持bash、fish、powershell、zsh4種shell的自動(dòng)補(bǔ)全。
$goctlcompletion--help
Generatetheautocompletionscriptforgoctlforthespecifiedshell.
Seeeachsub-command'shelpfordetailsonhowtousethegeneratedscript.
Usage:
goctlcompletion[command]
AvailableCommands:
bashGeneratetheautocompletionscriptforbash
fishGeneratetheautocompletionscriptforfish
powershellGeneratetheautocompletionscriptforpowershell
zshGeneratetheautocompletionscriptforzsh
Flags:
-h,--helphelpforcompletion
Use"goctlcompletion[command]--help"formoreinformationaboutacommand.
查看當(dāng)前使用的shell
$echo$SHELL
/bin/zsh
由于當(dāng)前使用的zsh,所以我們來(lái)看一下zsh的自動(dòng)補(bǔ)全設(shè)置幫助
$goctlcompletionzsh--help
Generatetheautocompletionscriptforthezshshell.
Ifshellcompletionisnotalreadyenabledinyourenvironmentyouwillneed
toenableit.Youcanexecutethefollowingonce:
echo"autoload-Ucompinit;compinit"~/.zshrc
Toloadcompletionsforeverynewsession,executeonce:
####Linux:
goctlcompletionzsh"${fpath[1]}/_goctl"
####macOS:
goctlcompletionzsh/usr/local/share/zsh/site-functions/_goctl
Youwillneedtostartanewshellforthissetuptotakeeffect.
Usage:
goctlcompletionzsh[flags]
Flags:
-h,--helphelpforzsh
--no-descriptionsdisablecompletiondescriptions
從上文可以看出,根據(jù)操作系統(tǒng)的不同,自動(dòng)補(bǔ)全的設(shè)置方式也不一樣,我這里是macOS,我們執(zhí)行一下對(duì)應(yīng)的指令:
$goctlcompletionzsh/usr/local/share/zsh/site-functions/_goctl
我們先重開一個(gè)終端來(lái)試一下:
#鍵入goctl后按下tab鍵查看自動(dòng)補(bǔ)全提示
$goctl#tab
api--Generateapirelatedfiles
bug--Reportabug
completion--Generatetheautocompletionscriptforthespecifiedshell
docker--GenerateDockerfile
env--Checkoreditgoctlenvironment
help--Helpaboutanycommand
kube--Generatekubernetesfiles
migrate--Migratefromtal-techtozeromicro
model--Generatemodelcode
quickstart--quicklystartaproject
rpc--Generaterpccode
template--Templateoperation
upgrade--Upgradegoctltolatestversion
常見錯(cuò)誤
goctlError:unknownflag:--generate-goctl-completion(eval):1:commandnotfound:_goctl按照1.3.6自動(dòng)補(bǔ)全配置重新進(jìn)行配置
goctlmigrate
幫助開發(fā)者從1.3.0之前版本無(wú)縫遷移到1.3.0及后的任意版本,如果使用的go-zero版本本身就是1.3.0及之后的,則無(wú)需做此操作。
為什么需要遷移?
go-zero在1.3.0版本做了組織變更,即用zeromicro替換原來(lái)的tal-tech組織名稱。
我現(xiàn)在有一個(gè)演示項(xiàng)目awesomemigrate是用舊版本goctl生成的,該項(xiàng)目的go-zero的module為
moduleawesomemigrate
go1.18
require/tal-tech/go-zerov1.2.5
假設(shè)我們需要將該項(xiàng)目的go-zero升級(jí)至截止目前最新版本1.3.3,要完成項(xiàng)目從tal-tech到zeromicro的升級(jí)前需要確保goctl版本大于v1.3.2,然后在執(zhí)行g(shù)octl遷移指令執(zhí)行,如果goctl版本小于v1.3.2,則需要升級(jí)。
#1.查看當(dāng)前goctl版本
$goctl--version
goctlversion1.2.5darwin/amd64
#2.由于goctl版本小于v1.3.2,則需要升級(jí)至最新,如果goctl版本已經(jīng)是1.3.2及之后了,則可以不用升級(jí)
$goinstall/zeromicro/go-zero/tools/goctl@latest
#3.查看一下遷移指令使用幫助
$goctlmigrate--help
NAME:
goctlmigrate-migratefromtal-techtozeromicro
USAGE:
goctlmigrate[commandoptions][arguments...]
DESCRIPTION:
migrateisatransitioncommandtohelpusersmigratetheirprojectsfromtal-techtozeromicroversion
OPTIONS:
--verbose,-vverboseenablesextralogging
--versionvaluethetargetreleaseversionof/zeromicro/go-zerotomigrate
#4.進(jìn)入待遷移的項(xiàng)目下,執(zhí)行遷移指令
$goctlmigrate--version1.3.3
#5.驗(yàn)證依賴是否存在問題
$gotest.
awesomemigrate[notestfiles]
遷移完成后,我們?cè)賮?lái)看看module文件
moduleawesomemigrate
go1.18
require/zeromicro/go-zerov1.3.3
在project搜索一下tal-tech的匹配結(jié)果會(huì)發(fā)現(xiàn)為0:
goctlenv
goctlenv主要是用于環(huán)境檢測(cè)、安裝、環(huán)境參數(shù)控制等功能,除此之外還可以查看當(dāng)前goctl的一些環(huán)境信息,以至于用戶在遇到bug時(shí)可以根據(jù)此環(huán)境上報(bào)當(dāng)前goctl處于的環(huán)境。
首先我們看看其使用說明
$goctlenv--help
NAME:
goctlenv-checkoreditgoctlenvironment
USAGE:
goctlenvcommand[commandoptions][arguments...]
COMMANDS:
installgoctlenvinstallation
checkdetectgoctlenvanddependencytools
OPTIONS:
--writevalue,-wvalueeditgoctlenvironment
--help,-hshowhelp
goctlenv支持環(huán)境查看、參數(shù)修改、依賴檢測(cè)安裝幾個(gè)功能,我們依次來(lái)看一下
環(huán)境查看
在不輸入任何flag的情況下,則是查看當(dāng)前goctl環(huán)境。
$goctlenv
GOCTL_OS=darwin
GOCTL_ARCH=amd64
GOCTL_HOME=/Users/keson/.goctl
GOCTL_DEBUG=false
GOCTL_CACHE=/Users/keson/.goctl/cache
GOCTL_VERSION=1.3.5
PROTOC_VERSION=3.19.4
PROTOC_GEN_GO_VERSION=v1.27.1
PROTO_GEN_GO_GRPC_VERSION=1.2.0
以上參數(shù)的大概說明為
參數(shù)名稱參數(shù)類型參數(shù)說明GOCTL_OSSTRING當(dāng)前操作系統(tǒng),常見值有darwin、windows、linux等GOCTL_ARCHSTRING當(dāng)前系統(tǒng)架構(gòu),常見值有amd64,386等GOCTL_HOMESTRING默認(rèn)為~/.goctlGOCTL_DEBUGBOOLEAN是否開啟debug模式,默認(rèn)為false,目前暫未使用,主要是goctl開發(fā)中可能用于控制調(diào)試模式GOCTL_CACHESTRINGgoctl緩存目錄,主要緩存下載的依賴protoc、protoc-gen-go、protoc-gen-go-grpc等GOCTL_VERSIONSTRING當(dāng)前goctl版本PROTOC_VERSIONSTRING當(dāng)前protoc版本,如未安裝則為空字符串PROTOC_GEN_GO_VERSIONSTRING當(dāng)前protoc-gen-go版本,如未安裝或者從/golang/protobuf安裝版本為v1.3.2之前的則為空字符串PROTO_GEN_GO_GRPC_VERSIONSTRING當(dāng)前protoc-gen-go-grpc版本,如未安裝則為空字符串
修改參數(shù)
比如我們將GOCTL_DEBUG修改為true
#修改前
$goctlenv|grep'GOCTL_DEBUG'
GOCTL_DEBUG=false
#修改GOCTL_DEBUG為true
$goctlenv-wGOCTL_DEBUG=true
#修改后
goctlenv|grep'GOCTL_DEBUG'
GOCTL_DEBUG=true
依賴檢測(cè)/安裝
我們來(lái)檢測(cè)一下我當(dāng)前的依賴都是否安裝好,目前依賴檢測(cè)內(nèi)容為protoc、protoc-gen-go、protoc-gen-go-grpc
#我們來(lái)檢查一下依賴安裝
$goctlenvcheck--verbose
[goctl-env]:preparingtocheckenv
[goctl-env]:lookingup"protoc"
[goctl-env]:"protoc"isnotfoundinPATH
[goctl-env]:lookingup"protoc-gen-go"
[goctl-env]:"protoc-gen-go"isnotfoundinPATH
[goctl-env]:lookingup"protoc-gen-go-grpc"
[goctl-env]:"protoc-gen-go-grpc"isnotfoundinPATH
[goctl-env]:checkenvfinish,somedependenciesisnotfoundinPATH,youcanexecute
command'goctlenvcheck--install'toinstallit,fordetails,pleaseexecutecommand
'goctlenvcheck--help'
#安裝依賴,安裝依賴有2中方式
#方式一
#$goctlenvcheck--install--force--verbose
#方式二
$goctlenvinstall--verbose-f
[goctl-env]:preparingtocheckenv
[goctl-env]:lookingup"protoc"
[goctl-env]:"protoc"isnotfoundinPATH
[goctl-env]:preparingtoinstall"protoc"
[goctl-env]:"protoc"isalreadyinstalledin"/Users/keson/go/bin/protoc"
[goctl-env]:lookingup"protoc-gen-go"
[goctl-env]:"protoc-gen-go"isnotfoundinPATH
[goctl-env]:preparingtoinstall"protoc-gen-go"
[goctl-env]:"protoc-gen-go"isalreadyinstalledin"/Users/keson/go/bin/protoc-gen-go"
[goctl-env]:lookingup"protoc-gen-go-grpc"
[goctl-env]:"protoc-gen-go-grpc"isnotfoundinPATH
[goctl-env]:preparingtoinstall"protoc-gen-go-grpc"
[goctl-env]:"protoc-gen-go-grpc"isalreadyinstalledin"/Users/keson/go/bin/protoc-gen-go-grpc"
[goctl-env]:congratulations!yourgoctlenvironmentisready!
goctlrpc
首先我們來(lái)看一下該指令的使用幫助
goctlrpc-h
Generaterpccode
Usage:
goctlrpc[flags]
goctlrpc[command]
AvailableCommands:
newGeneraterpcdemoservice
protocGenerategrpccode
templateGenerateprototemplate
Flags:
--branchstringThebranchoftheremoterepo,itdoesworkwith--remote
-h,--helphelpforrpc
--homestringThegoctlhomepathofthetemplate,--homeand--remotecannotbesetatthesametime,iftheyare,--remotehashigherpriority
--ostringOutputasampleprotofile
--remotestringTheremotegitrepoofthetemplate,--homeand--remotecannotbesetatthesametime,iftheyare,--remotehashigherpriority
Thegitrepodirectorymustbeconsistentwiththe/zeromicro/go-zero-templatedirectorystructure
Use"goctlrpc[command]--help"formoreinformationaboutacommand.
該指令提供了三個(gè)子指令,new是快速創(chuàng)建一個(gè)zrpc服務(wù),protoc是根據(jù)proto描述文件生成zrpc代碼,而template則是快速生成一個(gè)proto模板,我們將重點(diǎn)圍繞goctlrpcprotoc指令來(lái)展開,看看goctlrpcprotoc的使用說明:
goctlrpcprotoc-h
Generategrpccode
Usage:
goctlrpcprotoc[flags]
Examples:
goctlrpcprotocto--go_out=./pb--go-grpc_out=./pb--zrpc_out=.
Flags:
--branchstringThebranchoftheremoterepo,itdoesworkwith--remote
-h,--helphelpforprotoc
--homestringThegoctlhomepathofthetemplate,--homeand--remotecannotbesetatthesametime,iftheyare,--remotehashigherpriority
--remotestringTheremotegitrepoofthetemplate,--homeand--remotecannotbesetatthesametime,iftheyare,--remotehashigherpriority
Thegitrepodirectorymustbeconsistentwiththe/zeromicro/go-zero-templatedirectorystructure
--stylestringThefilenamingformat,see[/zeromicro/go-zero/tree/master/tools/goctl/config/readme.md](default"gozero")
-v,--verboseEnablelogoutput
--zrpc_outstringThezrpcoutputdirectory
goctlrpcprotoc到底怎么使用,為什么示例里面有--go_out、--go-grpc_out參數(shù),而查看help的時(shí)候卻沒有看到介紹?目前我們先這樣理解,我們先拋開goctl,根據(jù)官方protoc生成grpc代碼時(shí)的指令是什么?會(huì)用到哪些flag,對(duì)于zrpc的代碼生成,你可以理解為goctl生成zrpc只是在生成grpc代碼指令的基礎(chǔ)上加了goctlrpc前綴和一些goctl生成zrpc需要的flag,而對(duì)于protoc及插件protoc-gen-go、protoc-gen-grpc-go的相關(guān)參數(shù)goctl只是做繼承,沒有必要顯示的在help里面再描述一遍,后面在分析源碼時(shí)可以給大家詳細(xì)講解一些這塊的設(shè)計(jì)和考慮,接下來(lái)我們用一個(gè)例子來(lái)演示一下,假設(shè)我們有一個(gè)to文件,拋開goctl,我們生成grpc代碼需要執(zhí)行的指令如下:
如果不知道grpc代碼是怎么生成的,這塊建議參考官方文檔grpc.io/
#進(jìn)入to所在目錄
$protocto--go_out.--go-grpc_out.
$tree
├──to
└──pb
├──greet.pb.go
└──greet_grpc.pb.go
那么按照上文對(duì)goctlrpcprotoc的介紹,我們生成zrpc代碼的指令則應(yīng)該為
#這里多了一個(gè)--zrpc_out用于指定zrpc代碼的輸出目錄
$goctlrpcprotocto--go_out=.--go-grpc_out=.--zrpc_out=.--verbose
[goctl-env]:preparingtocheckenv
[goctl-env]:lookingup"protoc"
[goctl-env]:"protoc"isinstalled
[goctl-env]:lookingup"protoc-gen-go"
[goctl-env]:"protoc-gen-go"isinstalled
[goctl-env]:lookingup"protoc-gen-go-grpc"
[goctl-env]:"protoc-gen-go-grpc"isinstalled
[goctl-env]:congratulations!yourgoctlenvironmentisready!
[command]:protocto--go_out.--go-grpc_out.
Done.
$tree
├──etc
│└──greet.yaml
├──go.mod
├──greet
│└──greet.go
├──greet.go
├──to
├──internal
│├──config
││└──config.go
│├──logic
││└──pinglogic.go
│├──server
││└──greetserver.go
│└──svc
│└──servicecontext.go
└──pb
├──greet.pb.go
└──greet_grpc.pb.go
8directories,11files
如果在生成代碼時(shí)需要輸出日志,可以加--verbose來(lái)顯示日志。
goctlrpcprotoc在生成zrpc代碼時(shí)會(huì)先對(duì)你的環(huán)境依賴進(jìn)行檢測(cè),如果沒有安裝則會(huì)自動(dòng)安裝依賴再生成代碼。
編輯器插件
為了提升大家對(duì)zero-api文件的編寫效率,我們分別對(duì)intellij和vscode提供了相應(yīng)的編輯器插件,vscode插件介紹及使用請(qǐng)參考/zeromicro/g
三、goctl使用中遇到的問題
goctl從最初的一個(gè)功能rpcproxy到當(dāng)前版本(v1.3.5)已經(jīng)擁有13個(gè)一級(jí)指令和近30個(gè)二級(jí)指令,期間goctl做了一些調(diào)整,而且,gcotl本身的前進(jìn)步伐也非常快,他更像是在摸索中前進(jìn),朝著更快,更好用的方向發(fā)展,因此在迭代的路上,goctl會(huì)顯得有些不穩(wěn)定,大家興許也遇到很多問題,這里大概總結(jié)一下大家在社區(qū)中反饋比較多的一些問題來(lái)分享一下。
1.386架構(gòu)上安裝goctl失??!
描述:antlr生成的源碼中,沒有對(duì)386架構(gòu)的uint的邊界值進(jìn)行很好的處理,導(dǎo)致邊界溢出
修復(fù)版本:v1.3.3
2.grpc到底安裝什么版本插件?
描述:熟悉grpc的人應(yīng)該都知道,生成grpc代碼的插件protoc-gen-go有兩個(gè)倉(cāng)庫(kù)在維護(hù),有3個(gè)安裝來(lái)源,2個(gè)維護(hù)倉(cāng)庫(kù)分別是:
#1.golang
#/golang/protobuf/protoc-gen-go
#2.protocolbuffers
#/protocolbuffers/protobuf-go/cmd/protoc-gen-go
三個(gè)安裝來(lái)源是
#1.golang維護(hù)的倉(cāng)庫(kù),目前已不推薦使用
#/golang/protobuf/protoc-gen-go
#2.protocolbuffers維護(hù)的,目前推薦使用的
#/protocolbuffers/protobuf-go/cmd/protoc-gen-go
#3.g
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職第二學(xué)年(護(hù)理)老年照護(hù)專項(xiàng)試題及答案
- 2025年大學(xué)本科(食品質(zhì)量與安全)食品分析試題及答案
- 2025年大學(xué)食品科學(xué)與工程(食品工程)試題及答案
- 2025年中職焊接技術(shù)與自動(dòng)化(手工焊接)試題及答案
- 養(yǎng)老院老人心理咨詢師培訓(xùn)制度
- 養(yǎng)老院心理慰藉制度
- 公共交通從業(yè)人員培訓(xùn)考核制度
- 2026年人工智能計(jì)算機(jī)視覺基礎(chǔ)知識(shí)題庫(kù)含答案
- 2026年刮痧師中醫(yī)理論考核試題含答案
- 2026年中級(jí)公共文化服務(wù)面試題及答案
- 土壤微生物群落結(jié)構(gòu)優(yōu)化研究
- 2024外研版四年級(jí)英語(yǔ)上冊(cè)Unit 4知識(shí)清單
- 四川省南充市2024-2025學(xué)年部編版七年級(jí)上學(xué)期期末歷史試題
- 國(guó)有企業(yè)三位一體推進(jìn)內(nèi)控風(fēng)控合規(guī)建設(shè)的問題和分析
- 急診預(yù)檢分診課件教學(xué)
- 2025年高二數(shù)學(xué)建模試題及答案
- 儲(chǔ)能集裝箱知識(shí)培訓(xùn)總結(jié)課件
- 幼兒園中班語(yǔ)言《雪房子》課件
- 房地產(chǎn)項(xiàng)目開發(fā)管理方案
- 堆垛車安全培訓(xùn)課件
- 貝林妥單抗護(hù)理要點(diǎn)
評(píng)論
0/150
提交評(píng)論