背景
对于初学者来说,新建一个项目时,对于代码结构的划分一般都会有困惑,怎么划分比较合理或一般大家是怎么进行划分?通过下面介绍一般go项目的代码结构划分,来解答初学者的困惑。
Go目录
通用目录结构
-
/cmd本项目的主干,每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如,
/cmd/myapp)。通常有一个小的main函数,从/internal和/pkg目录导入和调用代码,除此之外没有别的东西。 -
/internal私有应用程序和库代码。
-
/pkg外部应用程序可以使用的库代码(例如
/pkg/mypubliclib)。 -
/vendor应用程序依赖项(手动管理或使用你喜欢的依赖项管理工具,如新的内置 Go Modules 功能)。
-
/configs配置文件模板或默认配置。将你的
confd或consul-template模板文件放在这里。 -
/initSystem init(systemd,upstart,sysv)和 process manager/supervisor(runit,supervisor)配置。
-
/scripts执行各种构建、安装、分析等操作的脚本。这些脚本保持了根级别的 Makefile 变得小而简单(例如,
https://github.com/hashicorp/terraform/blob/master/Makefile)。有关示例,请参见 /scripts 目录。 -
/build打包和持续集成。将你的云( AMI )、容器( Docker )、操作系统( deb、rpm、pkg )包配置和脚本放在
/build/package目录下。将你的 CI (travis、circle、drone)配置和脚本放在/build/ci目录中 -
/deployIaaS、PaaS、系统和容器编排部署配置和模板(docker-compose、kubernetes/helm、mesos、terraform、bosh)。注意,在一些存储库中(特别是使用 kubernetes 部署的应用程序),这个目录被称为
/deploy。 -
/test额外的外部测试应用程序和测试数据。你可以随时根据需求构造
/test目录。对于较大的项目,有一个数据子目录是有意义的。例如,你可以使用/test/data或/test/testdata
web服务目录
-
/apiOpenAPI/Swagger 规范,JSON 模式文件,协议定义文件。有关示例,请参见 /api 目录。
-
/web特定于 Web 应用程序的组件:静态 Web 资产、服务器端模板和 SPAs。
其他目录
-
/docs设计和用户文档(除了 godoc 生成的文档之外)。有关示例,请参阅 /docs 目录。
-
/tools这个项目的支持工具。注意,这些工具可以从
/pkg和/internal目录导入代码。有关示例,请参见 /tools 目录。 -
/examples你的应用程序和/或公共库的示例。有关示例,请参见 /examples 目录。
-
/third_party外部辅助工具,分叉代码和其他第三方工具(例如 Swagger UI)。
-
/githooksGit hooks。
-
/assets与存储库一起使用的其他资产(图像、徽标等)。
-
/website如果你不使用 Github 页面,则在这里放置项目的网站数据。有关示例,请参见 /website 目录。