前言
最近在工作中发现,项目的代码量在不断地增长,如果都挤在一个文件里阅读性就太差了,良好的目录与文件结构十分重要,尤其是团队合作的时候,良好的目录与文件结构可以减少很多不必要的麻烦,本文对Go项目的结构进行了一些总结,讲述通用的Go应用程序项目的一个基本布局。
Go目录
/cmd
这是项目的主干部分。每个应用程序的目录名应该与想要的可执行文件的名称相匹配(如/cmd/myapp
)
注意:这个目录中不要放置太多的代码,通常是有一个小的main
函数,从别的目录导入代码或者调用代码。/internal
私有应用程序和库代码。可以选择在internal包中添加一些额外的结构,来分割共享和非共享的内部代码。/pkg
外部应用程序可以使用的库代码。vendor
应用程序依赖项,如新的内置Go Modules
功能。可以使用go mod vendor
命令创建/vendor
目录。
注意:如果未使用默认情况下处于启用状态的 Go 1.14,则可能需要在go build
命令中添加-mod=vendor
标志。
服务应用程序目录
/api
OpenAPI/Swagger 规范,JSON 模式文件
Web应用程序目录
/web
特定于 Web 应用程序的组件:静态 Web 资产、服务器端模板和 SPAs。
通用应用目录
/configs
配置文件模板或默认配置。/init
System init(systemd,upstart,sysv)和 process manager/supervisor(runit,supervisor)配置。/scripts
执行各种构建、安装、分析等操作的脚本。/build
打包和持续集成。/deployments
IaaS、PaaS、系统和容器编配部署配置和模板(docker-compose、kubernetes/helm、mesos、terraform、bosh)。/test
额外的外部测试应用程序和测试数据。
其他目录
/docs
设计和用户文档(除了 godoc 生成的文档之外)/tools
这个项目的支持工具。注意,这些工具可以从/pkg
和/internal
目录导入代码。/examples
应用程序和/或公共库的示例。/third_party
外部辅助工具,分叉代码和其他第三方工具。/githooks
Git hooks。/assets
与存储库一起使用的其他资产(图像等)/website
如果不使用 Github 页面,则在这里放置项目的网站数据。
不应该拥有的目录
/src
有些 Go 项目确实有一个src
文件夹,但这通常发生在开发人员有 Java 背景,在Java中它是一种常见的模式。如果可以的话,尽量不要采用这种 Java 模式。
参考:https://github.com/golang-standards/project-layout
本文是一个简短的总结,如果还有细节上不太明白的地方,可以去这个网站上多看看研究研究。