簡介
做大量的輸入,通過對比、借鑒,加上自己的經驗,產出一個盡可能優的方案。
開源界優秀項目的結構示例
因為最新的 Go 版本已經使用 module 作為版本依賴,所以,所有項目的 vendor 我都忽略,建議直接使用 module 來管理依賴,而且較好的解決某些庫國內訪問不了的問題,參考:https://studygolang.com/topics/8737
Docker
├── api // 存放對外公開的 API 規則
├── builder // 存放構建腳本等
├── cli // 命令行的主要邏輯
├── cmd // 存放可執行程序,main 包放這個目錄中
├── contrib // 存放一些有用的腳本或文件,但不是項目的核心部分
├── docs // 存放文檔
├── internal // 只在本項目使用的包(私有)
├── pkg // 本項目以及其他項目可以使用的包(公有)
├── plugin // 提供插件功能
Kubernetes
https://github.com/kubernetes/kubernetes
├── api
├── build // 存放構建腳本等
├── cmd
├── docs
├── pkg
├── plugin
├── test // 單元測試之外的測試程序、測試數據
├── third_party // 經過修改的第三方的代碼
Gogs
├── cmd
├── conf // 對配置進行解析
├── docker // 存放 docker 腳本
├── models // MVC 中的 model
├── pkg
├── public // 靜態公共資源,實際項目會將其存入 CDN
├── routes // 路由
├── scripts // 腳本文件
├── templates // 存放模板文件
``
### influxdb
https://github.com/influxdata/influxdb
├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等,相當於 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts
### 開源項目小結
總體上,這些優秀開源項目,沒有統一一致的目錄結構方式,但大體上,有一些通用的地方,這就有了** https://github.com/golang-standards/project-layout **這個項目。
## 標准 Go 項目布局(結構)
https://github.com/golang-standards/project-layout 項目總結了 Go 項目的布局,我們一起看看這些主要的目錄。
#### /cmd
該目錄用於存放 Go 項目的入口,即 main.main。一般來說,我們應該在 cmd 目錄下創建子目錄,子目錄名稱代表可執行程序的名稱。上面列出的優秀開源項目基本上遵循了這一規則。
事實上,Go 語言本身,以及 github.com/golang/tools 都采用了 cmd 及其子目錄的形式,所以咱們的項目沒有理由不使用。
一般來說,該目錄中的代碼應該盡可能少。
#### /internal
這是 Go 包的一個特性,放在該包中的代碼,表明只希望項目內部使用,是項目或庫私有的,其他項目或庫不能使用。
#### /pkg
該包可以和 internal 對應,是公開的。一般來說,放在該包的代碼應該和具體業務無關,方便本項目和其他項目重用。當你決定將代碼放入該包時,你應該對其負責,因為別人很可能使用它。
因為 GOPATH 中有一個目錄就是 pkg,所以,社區有些人對該目錄不太能接受。但不管怎么樣,開源界有很多優秀項目在使用它,這里有一些使用它的項目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md
#### /api
該目錄用來存放 OpenAPI/Swagger 規則說明, JSON 格式定義, 協議定義文件等。也有可能用來存放具體的對外公開 API,比如 Docker:https://github.com/moby/moby/tree/master/api/server 。
#### /init
存放隨着系統自動啟動腳本,如:systemd, upstart, sysv;或者通過 supervisor 進行進程管理的腳本。
#### /scripts
存放 build、install、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔。
#### /build
該目錄用於存放打包和持續集成相關腳本。
#### /test
一般用來存放除單元測試、基准測試之外的測試,比如集成測試、測試數據等。
Go 語言源碼倉庫中就有 test 目錄。
#### /docs
存放設計和用戶文檔
#### /tools
存放項目的支持工具。
#### /third_party
從第三代碼包抽取過來的。根據官方建議,包名不應該有 _,所以本人不建議使用。真有這樣的需要,考慮命名為 thirdparty。