簡介
做大量的輸入署照,通過對比臭脓、借鑒酗钞,加上自己的經(jīng)驗,產(chǎn)出一個盡可能優(yōu)的方案。
開源界優(yōu)秀項目的結(jié)構(gòu)示例
因為最新的 Go 版本已經(jīng)使用 module 作為版本依賴砚作,所以窘奏,所有項目的 vendor 我都忽略,建議直接使用 module 來管理依賴葫录,而且較好的解決某些庫國內(nèi)訪問不了的問題着裹,參考:http://www.reibang.com/p/d21fdd13eae8
Docker
https://github.com/docker/engine
├── api // 存放對外公開的 API 規(guī)則
├── builder // 存放構(gòu)建腳本等
├── cli // 命令行的主要邏輯
├── cmd // 存放可執(zhí)行程序,main 包放這個目錄中
├── contrib // 存放一些有用的腳本或文件米同,但不是項目的核心部分
├── docs // 存放文檔
├── internal // 只在本項目使用的包(私有)
├── pkg // 本項目以及其他項目可以使用的包(公有)
├── plugin // 提供插件功能
Kubernetes
https://github.com/kubernetes/kubernetes
├── api
├── build // 存放構(gòu)建腳本等
├── cmd
├── docs
├── pkg
├── plugin
├── test // 單元測試之外的測試程序骇扇、測試數(shù)據(jù)
├── third_party // 經(jīng)過修改的第三方的代碼
Gogs
├── cmd
├── conf // 對配置進(jìn)行解析
├── docker // 存放 docker 腳本
├── models // MVC 中的 model
├── pkg
├── public // 靜態(tài)公共資源,實際項目會將其存入 CDN
├── routes // 路由
├── scripts // 腳本文件
├── templates // 存放模板文件
influxdb
https://github.com/influxdata/influxdb
├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等面粮,相當(dāng)于 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts
開源項目小結(jié)
總體上少孝,這些優(yōu)秀開源項目,沒有統(tǒng)一一致的目錄結(jié)構(gòu)方式熬苍,但大體上稍走,有一些通用的地方,這就有了** https://github.com/golang-standards/project-layout **這個項目柴底。
標(biāo)準(zhǔn) Go 項目布局(結(jié)構(gòu))
https://github.com/golang-standards/project-layout 項目總結(jié)了 Go 項目的布局婿脸,我們一起看看這些主要的目錄。
/cmd
該目錄用于存放 Go 項目的入口柄驻,即 main.main狐树。一般來說,我們應(yīng)該在 cmd 目錄下創(chuàng)建子目錄鸿脓,子目錄名稱代表可執(zhí)行程序的名稱抑钟。上面列出的優(yōu)秀開源項目基本上遵循了這一規(guī)則。
事實上答憔,Go 語言本身味赃,以及 github.com/golang/tools 都采用了 cmd 及其子目錄的形式,所以咱們的項目沒有理由不使用虐拓。
一般來說心俗,該目錄中的代碼應(yīng)該盡可能少。
/internal
這是 Go 包的一個特性蓉驹,放在該包中的代碼城榛,表明只希望項目內(nèi)部使用,是項目或庫私有的态兴,其他項目或庫不能使用狠持。
/pkg
該包可以和 internal 對應(yīng),是公開的瞻润。一般來說喘垂,放在該包的代碼應(yīng)該和具體業(yè)務(wù)無關(guān)甜刻,方便本項目和其他項目重用。當(dāng)你決定將代碼放入該包時正勒,你應(yīng)該對其負(fù)責(zé)得院,因為別人很可能使用它。
因為 GOPATH 中有一個目錄就是 pkg章贞,所以祥绞,社區(qū)有些人對該目錄不太能接受。但不管怎么樣鸭限,開源界有很多優(yōu)秀項目在使用它蜕径,這里有一些使用它的項目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md
/api
該目錄用來存放 OpenAPI/Swagger 規(guī)則說明, JSON 格式定義, 協(xié)議定義文件等。也有可能用來存放具體的對外公開 API败京,比如 Docker:https://github.com/moby/moby/tree/master/api/server 兜喻。
/init
存放隨著系統(tǒng)自動啟動腳本,如:systemd, upstart, sysv赡麦;或者通過 supervisor 進(jìn)行進(jìn)程管理的腳本虹统。
/scripts
存放 build、install隧甚、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔渡冻。
/build
該目錄用于存放打包和持續(xù)集成相關(guān)腳本戚扳。
/test
一般用來存放除單元測試、基準(zhǔn)測試之外的測試族吻,比如集成測試帽借、測試數(shù)據(jù)等。
Go 語言源碼倉庫中就有 test 目錄超歌。
/docs
存放設(shè)計和用戶文檔
/tools
存放項目的支持工具砍艾。
/third_party
從第三代碼包抽取過來的。根據(jù)官方建議巍举,包名不應(yīng)該有 _脆荷,所以本人不建議使用。真有這樣的需要懊悯,考慮命名為 thirdparty蜓谋。