深入了解Go項(xiàng)目標(biāo)準(zhǔn)目錄布局
很多的時(shí)候,我們開發(fā)一個(gè)簡(jiǎn)單的Go項(xiàng)目的時(shí)候并不需要糾結(jié)于項(xiàng)目的的目錄布局,因?yàn)槲覀儠?huì)將所有g(shù)o源碼文件扔在項(xiàng)目的根目錄中,就像下面這樣:
demo ├── main.go ├── model.go └── service.go
但當(dāng)我們的項(xiàng)目變得復(fù)雜的時(shí)候,我們就需要好好思考怎么組織我們的項(xiàng)目了,這時(shí)候你可能會(huì)想,用官方的Go項(xiàng)目目錄布局就好了,然而Go的官方并沒有給出一個(gè)標(biāo)準(zhǔn)的Go項(xiàng)目標(biāo)準(zhǔn)目錄布局。
目前,Go社區(qū)開發(fā)者比較推薦的是project-layout項(xiàng)目中給出的目錄布局,如:
demo ├── api ├── assets ├── build ├── cmd ├── configs ├── deployments ├── docs ├── examples ├── githooks ├── init ├── internal ├── pkg ├── scripts ├── test ├── third_party ├── tools ├── vendor ├── web └── website
然而官方并不推薦這種項(xiàng)目布局方式,下面是Go團(tuán)隊(duì)開發(fā)leader Russ Cox對(duì)project-layout目錄的意見:
大體上,我們可以將Go的項(xiàng)目分為兩類,應(yīng)用項(xiàng)目與庫(kù)項(xiàng)目。
應(yīng)用項(xiàng)目:即包含可執(zhí)行文件的項(xiàng)目,項(xiàng)目開發(fā)后,需要編譯成可執(zhí)行文件并上線運(yùn)行。
庫(kù)項(xiàng)目:庫(kù)文件一般用于暴露Api,被其他項(xiàng)目通過import關(guān)鍵字引入。
應(yīng)用項(xiàng)目與庫(kù)項(xiàng)目的目錄布局方式稍有差異。
應(yīng)用項(xiàng)目
對(duì)于應(yīng)用項(xiàng)目,其目錄布局方式我們可以參考Go項(xiàng)目自身,以及一些使用Go語言開發(fā)的優(yōu)秀開源項(xiàng)目(如Docker,Kubernetes,etcd)等,通過研究這些項(xiàng)目的目錄布局,我們可以抽象出以下標(biāo)準(zhǔn)目錄:
demo ├── cmd │ ├── app1 │ │ └── main.go │ └── app2 │ └── main.go ├── go.mod ├── go.sum ├── internal │ ├── pkga │ │ └── pkg_a.go │ └── pkgb │ └── pkg_b.go ├── pkg1 │ └── pkg1.go ├── pkg2 │ └── pkg2.go └── vendor
cmd
可執(zhí)行文件目錄,如果一個(gè)項(xiàng)目有多個(gè)可執(zhí)行文件,可以放在不同的子目錄中,如上面例子中的app1和app2目錄。
internal
項(xiàng)目?jī)?nèi)部私有代碼,其他項(xiàng)目引入時(shí)會(huì)報(bào)錯(cuò)。
pkgN:
注意,這里并不是說一定要pkg為前綴來命名,你可以對(duì)取任意符合包命名規(guī)范的名稱,比如service,model等
即上面示例中的pkg1與pkg2,pkgN包與internal包一樣存放項(xiàng)目的依賴代碼,但存儲(chǔ)在這里的代碼,可以被其項(xiàng)目引入。
vendor
這個(gè)目錄用于存儲(chǔ)項(xiàng)目的依賴包,但由于現(xiàn)今Go項(xiàng)目都是使用go module進(jìn)行依賴管理,因此這個(gè)目錄是可省略的。
如果我們的項(xiàng)目只有一個(gè)可執(zhí)行文件,可以將main.go文件直接寫在根目錄,而vendor可以省略,因此,項(xiàng)目目錄可以進(jìn)一步精簡(jiǎn)為:
demo ├── go.mod ├── go.sum ├── internal │ ├── pkga │ │ └── pkg_a.go │ └── pkgb │ └── pkg_b.go ├── main.go ├── pkg1 │ └── pkg1.go └── pkg2 └── pkg2.go
庫(kù)項(xiàng)目
庫(kù)項(xiàng)目不需要可執(zhí)行文件,相比于應(yīng)用項(xiàng)目,省略了cmd目錄,其標(biāo)準(zhǔn)目錄下:
demo ├── go.mod ├── go.sum ├── internal │ ├── pkga │ │ └── pkg_a.go │ └── pkgb │ └── pkg_b.go ├── pkg1 │ └── pkg1.go └── pkg2 └── pkg2.go
如果我們的庫(kù)項(xiàng)目比較簡(jiǎn)單,可以采用平鋪式項(xiàng)目布局,即將所有的功能寫在一個(gè)包里,所有源碼目錄放在根目錄下,如:
demo ├── feature1.go ├── feature2.go ├── feature3.go ├── go.mod └── go.sum
平鋪式的項(xiàng)目布局非常適合簡(jiǎn)單的庫(kù)項(xiàng)目,事實(shí)上,很多復(fù)雜的庫(kù)項(xiàng)目也會(huì)將大量的代碼放在根目錄下,因?yàn)檫@樣,其他項(xiàng)目使用import引入項(xiàng)目的包時(shí),路徑會(huì)比較短,比如我們有一個(gè)結(jié)構(gòu)體A,放在pkg1包下與放在根目錄下,其引路徑分別是:
import "demo" import "demo/pkg1"
小結(jié)
好了,閱讀到這里,想必你已經(jīng)了解了Go應(yīng)用項(xiàng)目與庫(kù)項(xiàng)目目錄布局的不同了吧。
不過,由于Go官方項(xiàng)目指定的項(xiàng)目布局,因此上述的幾種項(xiàng)目目錄都是社區(qū)開發(fā)的約定俗成,并不具備強(qiáng)制性,你也可以定制自己的Go項(xiàng)目目錄布局,不過我想,使用社區(qū)開發(fā)都遵循的目錄規(guī)范,還是有助于降低團(tuán)隊(duì)開發(fā)人員的認(rèn)知與交流成本的。
到此這篇關(guān)于深入了解Go項(xiàng)目標(biāo)準(zhǔn)目錄布局的文章就介紹到這了,更多相關(guān)Go標(biāo)準(zhǔn)目錄布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

Go 語言下基于Redis分布式鎖的實(shí)現(xiàn)方式

go語言實(shí)現(xiàn)短信發(fā)送實(shí)例探究

解決Goland中利用HTTPClient發(fā)送請(qǐng)求超時(shí)返回EOF錯(cuò)誤DEBUG

深入解析golang中的標(biāo)準(zhǔn)庫(kù)flag

GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況

Go導(dǎo)入不同目錄下包報(bào)錯(cuò)的解決方法

VSCode安裝go相關(guān)插件失敗的簡(jiǎn)單解決方案