https://github.com/golang-standards/project-layout 項目總結了 Go 項目的布局,這是Go應用程序項目的基本布局,并不是Go核心開發(fā)團隊定義的官方標準宴卖;但是席纽,這是Go生態(tài)系統(tǒng)中的一種常見的項目布局模式。
Go目錄
/cmd
該目錄用于存放 Go 項目的入口,即 main.go衣迷。一般來說畏鼓,我們應該在 cmd 目錄下創(chuàng)建子目錄,子目錄名稱代表可執(zhí)行程序的名稱(例如/cmd/myapp)壶谒。上面列出的優(yōu)秀開源項目基本上遵循了這一規(guī)則云矫。
一般來說,該目錄中的代碼應該盡可能少汗菜。如果認為該代碼可以導入并在其他項目中使用让禀,那么它應該位于/pkg目錄中。如果該代碼不可重用陨界,或者不希望其他人重用它巡揍,則將該代碼放在/internal目錄中。
/internal
這是 Go 包的一個特性菌瘪,放在該包中的代碼腮敌,表明只希望項目內(nèi)部使用,是項目或庫私有的俏扩,其他項目或庫不能使用糜工。請注意,不限于頂層internal目錄录淡,internal在項目樹的任何級別上都可以有多個目錄捌木。
可以選擇向內(nèi)部包中添加一些額外的結構,以分隔共享和非共享內(nèi)部代碼嫉戚。它不是必需的(尤其是對于較小的項目)刨裆,但是最好有視覺提示來顯示包的用途。實際應用程序代碼可以進入/internal/app目錄(例如/internal/app/myapp)彬檀,而這些應用程序共享的代碼可以進入/internal/pkg目錄(例如/internal/pkg/myprivlib)帆啃。
/pkg
該包可以和 internal 對應,是公開的窍帝。一般來說纪挎,放在該包的代碼應該和具體業(yè)務無關搪花,方便本項目和其他項目重用缝驳。當你決定將代碼放入該包時栏尚,你應該對其負責,因為別人很可能使用它拥峦。
如果應用程序項目很小贴膘,并且嵌套的額外層次不會增加太多價值(除非您真的想要,請不要使用它略号。當它變得足夠大并且您的根目錄變得非常復雜時(特別是如果您有很多非Go應用程序組件)刑峡,請考慮一下洋闽。
/vendor
應用程序依存關系,GO1.13啟用go module來代替突梦,并不需要vendor目錄了诫舅。
server application目錄
/api
該目錄用來存放 OpenAPI/Swagger 規(guī)則說明, JSON 格式定義, 協(xié)議定義文件等。也有可能用來存放具體的對外公開 API.
web application 目錄
/web
Web應用程序特定的組件:靜態(tài)Web資產(chǎn)宫患,服務器端模板和SPA刊懈。
common application目錄
/configs
配置文件模板或默認配置。
/init
存放隨著系統(tǒng)自動啟動腳本娃闲,如:systemd, upstart, sysv虚汛;或者通過 supervisor 進行進程管理的腳本。
/scripts
存放 build皇帮、install卷哩、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔属拾。
/build
該目錄用于存放打包和持續(xù)集成相關腳本将谊。將云(AMI),容器(Docker)渐白,操作系統(tǒng)(deb瓢娜,rpm,pkg)軟件包配置和腳本放在/build/package目錄中礼预。
將CI(travis,circle虏劲,drone)配置和腳本放在/build/ci目錄中托酸。請注意,某些配置項工具(例如Travis CI)對于其配置文件的位置非常挑剔柒巫。嘗試將配置文件放在/build/ci目錄中励堡,將它們鏈接到CI工具期望它們的位置(如果可能)。
/deployments
IaaS堡掏,PaaS应结,系統(tǒng)和容器編排部署配置和模板(docker-compose,kubernetes / helm泉唁,mesos鹅龄,terraform,bosh)亭畜。
/test
一般用來存放除單元測試扮休、基準測試之外的測試,比如集成測試拴鸵、測試數(shù)據(jù)等玷坠。
其他目錄
/docs
設計和用戶文檔(除了godoc生成的文檔之外)蜗搔。
/tools
存放項目的支持工具。請注意八堡,這些工具可以從/pkg和/internal目錄導入代碼樟凄。
/examples
應用程序或公共庫的示例。
/third_party
外部幫助程序工具兄渺,分叉的代碼和其他第三方工具(例如Swagger UI)缝龄。
/githooks
githooks
/assets
與資源庫一起使用的其他資產(chǎn)(圖像,徽標等)溶耘。
/website
如果不使用Github頁面二拐,則在這里放置項目的網(wǎng)站數(shù)據(jù)。