Go项目通用代码结构

404 阅读2分钟

背景

对于初学者来说,新建一个项目时,对于代码结构的划分一般都会有困惑,怎么划分比较合理或一般大家是怎么进行划分?通过下面介绍一般go项目的代码结构划分,来解答初学者的困惑。

Go目录

通用目录结构

  • /cmd

    本项目的主干,每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如,/cmd/myapp)。通常有一个小的 main 函数,从 /internal 和 /pkg 目录导入和调用代码,除此之外没有别的东西。

  • /internal

    私有应用程序和库代码。

  • /pkg

    外部应用程序可以使用的库代码(例如 /pkg/mypubliclib)。

  • /vendor

    应用程序依赖项(手动管理或使用你喜欢的依赖项管理工具,如新的内置 Go Modules 功能)。

  • /configs

    配置文件模板或默认配置。将你的 confd 或 consul-template 模板文件放在这里。

  • /init

    System 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 目录中

  • /deploy

    IaaS、PaaS、系统和容器编排部署配置和模板(docker-compose、kubernetes/helm、mesos、terraform、bosh)。注意,在一些存储库中(特别是使用 kubernetes 部署的应用程序),这个目录被称为 /deploy

  • /test

    额外的外部测试应用程序和测试数据。你可以随时根据需求构造 /test 目录。对于较大的项目,有一个数据子目录是有意义的。例如,你可以使用 /test/data 或 /test/testdata

web服务目录

  • /api

    OpenAPI/Swagger 规范,JSON 模式文件,协议定义文件。有关示例,请参见 /api 目录。

  • /web

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

其他目录

  • /docs

    设计和用户文档(除了 godoc 生成的文档之外)。有关示例,请参阅 /docs 目录。

  • /tools

    这个项目的支持工具。注意,这些工具可以从 /pkg 和 /internal 目录导入代码。有关示例,请参见 /tools 目录。

  • /examples

    你的应用程序和/或公共库的示例。有关示例,请参见 /examples 目录。

  • /third_party

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

  • /githooks

    Git hooks。

  • /assets

    与存储库一起使用的其他资产(图像、徽标等)。

  • /website

    如果你不使用 Github 页面,则在这里放置项目的网站数据。有关示例,请参见 /website 目录。