参考自golang-standards/project-layout

随着项目越来越复杂,开发人员越来越多,对于代码结构的要求也就越来越高了,如果项目结构不合理的话,维护起来也不方便,而且多人协调开发的难度也会加大,所以我想要规划一个完整的Go语言项目应该是什么样的结构,一开始我是参考kubernetes的项目结构,他们是以Cobra为基础来构建的整个项目,包结构非常复杂,我看起来确实有点困难,所以找到了这个项目,而且k8s跟它的结构基本一致,所以就以这个项目作为学习的例子


根目录

  • README.md

用来描述项目本身的文件,如何编译,如何运行等

  • Makefile

用来调用/scripts中的脚本,完成编译,测试,打包等其他的操作

Go Directories

/cmd

程序的入口,所有的main函数应该都在这里

  • 目录的名字应该与可执行文件的名字相同
  • 不要在这个目录中写太多的代码
  • 如果你发现在这个目录中的代码有可能被其他地方引用,那么这些代码应该被移到/pkg目录中
  • 如果你这里的代码不希望被其他人引用,那么代码应该放到/internal目录中
  • 明确你的意图,不要让别人误解

/internal

私有的applicationlibrary代码,这里的代码都是你不希望被别人引用的

  • 将你的application代码放到/internal/app
  • 将你的library代码放到/internal/pkg

/pkg

library代码,这里的都应该是可以被外部的applications引用的

  • 其他的项目可能会引入这里的代码,所以将代码放入之前要思考一下

/vendor

存放依赖,可以使用自己喜欢的依赖管理工具,目前我使用的是glide

Common Application Directories

/configs

配置文件的模板,或者是默认的配置文件

/init

系统初始化(systemd,upstart,sysv)或者其他进程管理工具的配置

/scripts

编译,安装,解析等各种脚本,它的目的是让根目录的Makefile保持简单

/build

打包,持续集成

  • 将云,容器,操作系统打包的配置和脚本放到/build/package目录中
  • 将ci配置,脚本放到/build/ci目录中

/deployments

IaaS,PaaS,系统和容器的编排配置及模板(例如docker-compose,kubernetes)

/test

额外的测试需要的app以及测试数据,可以分为/test/data等,这个目录也可以被ignore

Service Application Directories

/api

用来存放 OpenAPI/Swagger 的接口描述文件,或者其他协议的接口描述文件

Web Application Directories

/web

web程序需要的组件,一般是静态文件和模板文件

Other Directories

/docs

设计及用户的文档,除了godoc生成以外的文档

/tools

这个项目用到的工具,这里也可以引用/pkg/internal中的代码

/examples

你的app的使用用例,或者是公开代码的调用方式

/third_party

外部的帮助工具,fork的代码,第三方的工具

/githooks

Git hooks

/assets

需要使用的其他的资源

不应该存在的目录

/src

这种一般是存在于Java项目中的,Go语言并不需要