1. 目录规范
一个好的目录结构至少要满足以下几个要求。
- 命名清晰:目录命名要清晰、简洁,不要太长,也不要太短,目录名要能清晰地表达出该目录实现的功能,并且目录名最好用单数。一方面是因为单数足以说明这个目录的功能,另一方面可以统一规范,避免单复混用的情况。
- 功能明确:一个目录所要实现的功能应该是明确的、并且在整个项目目录中具有很高的辨识度。也就是说,当需要新增一个功能时,我们能够非常清楚地知道把这个功能放在哪个目录下。
- 全面性:目录结构应该尽可能全面地包含研发过程中需要的功能,例如文档、脚本、源码管理、API 实现、工具、第三方包、测试、编译产物等。
- 可预测性:项目规模一定是从小到大的,所以一个好的目录结构应该能够在项目变大时,仍然保持之前的目录结构。
- 可扩展性:每个目录下存放了同类的功能,在项目变大时,这些目录应该可以存放更多同类功能。
根据功能,我们可以将目录结构分为结构化目录结构和平铺式目录结构两种。
- 结构化目录结构主要用在
Go
应用中,相对来说比较复杂; - 而平铺式目录结构主要用在
Go
包中,相对来说比较简单;
2. 平铺式目录结构
一个 Go
项目可以是一个应用,也可以是一个代码框架 / 库,当项目是代码框架 / 库时,比较适合采用平铺式目录结构。
平铺方式就是在项目的根目录下存放项目的代码,整个目录结构看起来更像是一层的,例如 log
包 github.com/golang/glog
就是平铺式的,目录如下:
$ ls glog/
glog_file.go glog.go glog_test.go LICENSE README
3. 结构化目录结构
当前 Go
社区比较推荐的结构化目录结构是 https://github.com/golang-standards/project-layout。虽然它并不是官方和社区的规范,但因为组织方式比较合理,被很多 Go
开发人员接受。
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── go.mod
├── init
├── internal
├── LICENSE.md
├── Makefile
├── pkg
├── README_zh-CN.md
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website
一个 Go
项目包含 3 大部分:Go
应用 、项目管理和文档。所以,我们的项目目录也可以分为这 3 大类。同时,Go
应用又贯穿开发阶段、测试阶段和部署阶段,相应的应用类的目录,又可以按开发流程分为更小的子类。所以整体来看,我们的目录结构可以按下图所示的方式来分类:
3.1 Go 应用开发目录
开发的代码包含前端代码和后端代码,可以分别存放在前端目录和后端目录中。
3.1.1 /web
前端代码存放目录,主要用来存放 Web 静态资源,服务端模板和单页应用(SPAs)。
3.1.2 /cmd
一个项目有很多组件,可以把组件