https://github.com/golang-standards/project-layout 项目总结了 Go 项目的布局,这是Go应用程序项目的基本布局,并不是Go核心开发团队定义的官方标准;但是,这是Go生态系统中的一种常见的项目布局模式。

Go目录

/cmd

该目录用于存放 Go 项目的入口,即 main.go。一般来说,我们应该在 cmd 目录下创建子目录,子目录名称代表可执行程序的名称(例如/cmd/myapp)。上面列出的优秀开源项目基本上遵循了这一规则。

一般来说,该目录中的代码应该尽可能少。如果认为该代码可以导入并在其他项目中使用,那么它应该位于/pkg目录中。如果该代码不可重用,或者不希望其他人重用它,则将该代码放在/internal目录中。

/internal

这是 Go 包的一个特性,放在该包中的代码,表明只希望项目内部使用,是项目或库私有的,其他项目或库不能使用。请注意,不限于顶层internal目录,internal在项目树的任何级别上都可以有多个目录。

可以选择向内部包中添加一些额外的结构,以分隔共享和非共享内部代码。它不是必需的(尤其是对于较小的项目),但是最好有视觉提示来显示包的用途。实际应用程序代码可以进入/internal/app目录(例如/internal/app/myapp),而这些应用程序共享的代码可以进入/internal/pkg目录(例如/internal/pkg/myprivlib)。

/pkg

该包可以和 internal 对应,是公开的。一般来说,放在该包的代码应该和具体业务无关,方便本项目和其他项目重用。当你决定将代码放入该包时,你应该对其负责,因为别人很可能使用它。

如果应用程序项目很小,并且嵌套的额外层次不会增加太多价值(除非您真的想要,请不要使用它。当它变得足够大并且您的根目录变得非常复杂时(特别是如果您有很多非Go应用程序组件),请考虑一下。

/vendor

应用程序依存关系,GO1.13启用go module来代替,并不需要vendor目录了。

server application目录

/api

该目录用来存放 OpenAPI/Swagger 规则说明, JSON 格式定义, 协议定义文件等。也有可能用来存放具体的对外公开 API.

web application 目录

/web

Web应用程序特定的组件:静态Web资产,服务器端模板和SPA。

common application目录

/configs

配置文件模板或默认配置。

/init

存放随着系统自动启动脚本,如:systemd, upstart, sysv;或者通过 supervisor 进行进程管理的脚本。

/scripts

存放 build、install、analysis 等操作脚本。这些脚本使得项目根目录的 Makefile 很简洁。

/build

该目录用于存放打包和持续集成相关脚本。将云(AMI),容器(Docker),操作系统(deb,rpm,pkg)软件包配置和脚本放在/build/package目录中。

将CI(travis,circle,drone)配置和脚本放在/build/ci目录中。请注意,某些配置项工具(例如Travis CI)对于其配置文件的位置非常挑剔。尝试将配置文件放在/build/ci目录中,将它们链接到CI工具期望它们的位置(如果可能)。

/deployments

IaaS,PaaS,系统和容器编排部署配置和模板(docker-compose,kubernetes / helm,mesos,terraform,bosh)。

/test

一般用来存放除单元测试、基准测试之外的测试,比如集成测试、测试数据等。

其他目录

/docs

设计和用户文档(除了godoc生成的文档之外)。

/tools

存放项目的支持工具。请注意,这些 工具 可以从/pkg和/internal目录导入代码。

/examples

应用程序或公共库的示例。

/third_party

外部帮助程序工具,分叉的代码和其他第三方工具(例如Swagger UI)。

/githooks

githooks

/assets

与资源库一起使用的其他资产(图像,徽标等)。

/website

如果不使用Github页面,则在这里放置项目的网站数据。

不应该拥有的目录

/src