Go?項目目錄布局保姆級教程
1. Go 目錄
/cmd
每個應(yīng)用程序的目錄名應(yīng)該與你想要的可執(zhí)行文件的名稱相匹配(例如,/cmd/myapp)。
不要在這個目錄中放置太多代碼。如果你認(rèn)為代碼可以導(dǎo)入并在其他項目中使用,那么它應(yīng)該位于 /pkg 目錄中。如果代碼不是可重用的,或者你不希望其他人重用它,請將該代碼放到 /internal 目錄中。你會驚訝于別人會怎么做,所以要明確你的意圖!
通常有一個小的 main 函數(shù),從 /internal 和 /pkg 目錄導(dǎo)入和調(diào)用代碼,除此之外沒有別的東西。
/internal
私有應(yīng)用程序和庫代碼。這是你不希望其他人在其應(yīng)用程序或庫中導(dǎo)入代碼。請注意,這個布局模式是由 Go 編譯器本身執(zhí)行的。有關(guān)更多細(xì)節(jié),請參閱Go 1.4 release notes 。注意,你并不局限于頂級 internal 目錄。在項目樹的任何級別上都可以有多個內(nèi)部目錄。
你可以選擇向 internal 包中添加一些額外的結(jié)構(gòu),以分隔共享和非共享的內(nèi)部代碼。這不是必需的(特別是對于較小的項目),但是最好有有可視化的線索來顯示預(yù)期的包的用途。你的實際應(yīng)用程序代碼可以放在 /internal/app 目錄下(例如 /internal/app/myapp),這些應(yīng)用程序共享的代碼可以放在 /internal/pkg 目錄下(例如 /internal/pkg/myprivlib)。
/pkg
外部應(yīng)用程序可以使用的庫代碼(例如 /pkg/mypubliclib)。其他項目會導(dǎo)入這些庫,希望它們能正常工作,所以在這里放東西之前要三思:-)注意,internal 目錄是確保私有包不可導(dǎo)入的更好方法,因為它是由 Go 強(qiáng)制執(zhí)行的。/pkg 目錄仍然是一種很好的方式,可以顯式地表示該目錄中的代碼對于其他人來說是安全使用的好方法。由 Travis Jeffery 撰寫的 I'll take pkg over internal 博客文章提供了 pkg 和 internal 目錄的一個很好的概述,以及什么時候使用它們是有意義的。
當(dāng)根目錄包含大量非 Go 組件和目錄時,這也是一種將 Go 代碼分組到一個位置的方法,這使得運(yùn)行各種 Go 工具變得更加容易(正如在這些演講中提到的那樣: 來自 GopherCon EU 2018 的 Best Practices for Industrial Programming , GopherCon 2018: Kat Zien - How Do You Structure Your Go Apps 和 GoLab 2018 - Massimiliano Pippi - Project layout patterns in Go )。
如果你想查看哪個流行的 Go 存儲庫使用此項目布局模式,請查看 /pkg 目錄。這是一種常見的布局模式,但并不是所有人都接受它,一些 Go 社區(qū)的人也不推薦它。
如果你的應(yīng)用程序項目真的很小,并且額外的嵌套并不能增加多少價值(除非你真的想要:-),那就不要使用它。當(dāng)它變得足夠大時,你的根目錄會變得非常繁瑣時(尤其是當(dāng)你有很多非 Go 應(yīng)用組件時),請考慮一下。
/vendor
應(yīng)用程序依賴項(手動管理或使用你喜歡的依賴項管理工具,如新的內(nèi)置 Go Modules 功能)。go mod vendor 命令將為你創(chuàng)建 /vendor 目錄。請注意,如果未使用默認(rèn)情況下處于啟用狀態(tài)的 Go 1.14,則可能需要在 go build 命令中添加 -mod=vendor 標(biāo)志。
如果你正在構(gòu)建一個庫,那么不要提交你的應(yīng)用程序依賴項。
注意,自從 1.13 以后,Go 還啟用了模塊代理功能(默認(rèn)使用 https://proxy.golang.org 作為他們的模塊代理服務(wù)器)。在here 閱讀更多關(guān)于它的信息,看看它是否符合你的所有需求和約束。如果需要,那么你根本不需要 vendor 目錄。
國內(nèi)模塊代理功能默認(rèn)是被墻的,七牛云有維護(hù)專門的的模塊代理 。
2. 服務(wù)應(yīng)用程序目錄
/api
OpenAPI/Swagger 規(guī)范,JSON 模式文件,協(xié)議定義文件。
有關(guān)示例,請參見 /api 目錄。
3. Web 應(yīng)用程序目錄
/web
特定于 Web 應(yīng)用程序的組件:靜態(tài) Web 資產(chǎn)、服務(wù)器端模板和 SPAs。
4. 通用應(yīng)用目錄
/configs
配置文件模板或默認(rèn)配置。
將你的 confd 或 consul-template 模板文件放在這里。
/init
System init(systemd,upstart,sysv)和 process manager/supervisor(runit,supervisor)配置。
/scripts
執(zhí)行各種構(gòu)建、安裝、分析等操作的腳本。
這些腳本保持了根級別的 Makefile 變得小而簡單(例如, https://github.com/hashicorp/terraform/blob/master/Makefile )。
有關(guān)示例,請參見 /scripts 目錄。
/build
打包和持續(xù)集成。
將你的云( AMI )、容器( Docker )、操作系統(tǒng)( deb、rpm、pkg )包配置和腳本放在 /build/package 目錄下。
將你的 CI (travis、circle、drone)配置和腳本放在 /build/ci 目錄中。請注意,有些 CI 工具(例如 Travis CI)對配置文件的位置非常挑剔。嘗試將配置文件放在 /build/ci 目錄中,將它們鏈接到 CI 工具期望它們的位置(如果可能的話)。
/deployments
IaaS、PaaS、系統(tǒng)和容器編排部署配置和模板(docker-compose、kubernetes/helm、mesos、terraform、bosh)。注意,在一些存儲庫中(特別是使用 kubernetes 部署的應(yīng)用程序),這個目錄被稱為 /deploy。
/test
額外的外部測試應(yīng)用程序和測試數(shù)據(jù)。你可以隨時根據(jù)需求構(gòu)造 /test 目錄。對于較大的項目,有一個數(shù)據(jù)子目錄是有意義的。例如,你可以使用 /test/data 或 /test/testdata (如果你需要忽略目錄中的內(nèi)容)。請注意,Go 還會忽略以“.”或“_”開頭的目錄或文件,因此在如何命名測試數(shù)據(jù)目錄方面有更大的靈活性。
有關(guān)示例,請參見 /test 目錄。
5. 其他目錄
/docs
設(shè)計和用戶文檔(除了 godoc 生成的文檔之外)。
有關(guān)示例,請參閱 /docs 目錄。
/tools
這個項目的支持工具。注意,這些工具可以從 /pkg 和 /internal 目錄導(dǎo)入代碼。
有關(guān)示例,請參見 /tools 目錄。
/examples
你的應(yīng)用程序和/或公共庫的示例。
有關(guān)示例,請參見 /examples 目錄。
/third_party
外部輔助工具,分叉代碼和其他第三方工具(例如 Swagger UI)。
/githooks
Git hooks。
/assets
與存儲庫一起使用的其他資產(chǎn)(圖像、徽標(biāo)等)。
/website
如果你不使用 Github 頁面,則在這里放置項目的網(wǎng)站數(shù)據(jù)。
有關(guān)示例,請參見 /website 目錄。
6. 你不應(yīng)該擁有的目錄
/src
有些 Go 項目確實有一個 src 文件夾,但這通常發(fā)生在開發(fā)人員有 Java 背景,在那里它是一種常見的模式。如果可以的話,盡量不要采用這種 Java 模式。你真的不希望你的 Go 代碼或 Go 項目看起來像 Java:-)
不要將項目級別 src 目錄與 Go 用于其工作空間的 src 目錄(如 How to Write Go Code 中所述)混淆。$GOPATH 環(huán)境變量指向你的(當(dāng)前)工作空間(默認(rèn)情況下,它指向非 windows 系統(tǒng)上的 $HOME/go)。這個工作空間包括頂層 /pkg, /bin 和 /src 目錄。你的實際項目最終是 /src 下的一個子目錄,因此,如果你的項目中有 /src 目錄,那么項目路徑將是這樣的: /some/path/to/workspace/src/your_project/src/your_code.go。注意,在 Go 1.11 中,可以將項目放在 GOPATH 之外,但這并不意味著使用這種布局模式是一個好主意。
以上就是Go 項目目錄布局保姆級教程的詳細(xì)內(nèi)容,更多關(guān)于Go 項目目錄布局的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go 1.21新增的slices包中切片函數(shù)用法詳解
Go 1.21新增的 slices 包提供了很多和切片相關(guān)的函數(shù),可以用于任何類型的切片,本文通過代碼示例為大家介紹了部分切片函數(shù)的具體用法,感興趣的小伙伴可以了解一下2023-08-08基于Golang實現(xiàn)Redis協(xié)議解析器
這篇文章主要為大家詳細(xì)介紹了如何通過GO語言編寫簡單的Redis協(xié)議解析器,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,需要的可以參考一下2023-03-03golang elasticsearch Client的使用詳解
這篇文章主要介紹了golang elasticsearch Client的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05