Go|看看别人的项目目录结构,那叫一个舒服!

23,480 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

🎐 放在前面说的话

大家好,我是北 👧🏻

本科在读,此为日常捣鼓.

如有不对,请多指教,也欢迎大家来跟我讨论鸭 👏👏👏

还有还有还有很重要的,麻烦大可爱们动动小手,给北点颗心心♥,北北需要鼓励嗷呜~

今天我们咻微咻微来整理一波Go项目目录结构昂~

u=3595753474,463823469&fm=253&fmt=auto&app=138&f=JPEG.webp

在Go语言领域遨游了也有大半年了,也写过一些小项目,但是自己对Go语言相关的项目目录结构还是不是很了解。因此,今天再一次理一下Go项目目录结构划分,因为好的目录结构绝对是可以提高各个方面的工作效率的。下面是我结合我这段时间在GitHub看过的一些优秀项目和平时接触到的一些优秀项目的结构如煎鱼等大佬的项目结构做出一些自己的分析总结...Let’s get it!

一、为什么要分层/分模块

  • 有利于标准化工作
  • 层次依赖降低
  • 降低整体的复杂度

二、目录规范

每个项目的目录结构并不是有规定模板的,也有很多优秀的项目并不是常规的项目布局,还是要依据项目类型、大小及灵活程度做调整,但一定要保证结构清晰! 一般要求:

  • 命名清晰:目录命名要清晰、简介,不宜过长或过短。目录名要求能清晰表达出该目录所要实现的功能,在清晰表达的基础上最好用单数,避免单复混用的情况。
  • 功能明确:一个目录所要实现的功能应该是明确的、并且在整个项目目录中具有高辨识度。
  • 全面性:目录结构应该尽可能全面地包含研发过程中需要的功能,例如文档、脚本、源码管理、API 实现、工具包、第三方包、测试、编译产物等。
  • 可预测性:项目规模一般是从小到大的,所以一个好的目录结构应该能够在项目变大时,仍然保持之前的目录结构。
  • 可扩展性:每个目录下存放了同类的功能,在项目变大时,这些目录应该可以存放更多同类功能

三、目录结构

项目的目录结构通常也是门面,内行人通过目录结构基本就能看出开发者是否有经验。优秀的项目结构可以让人,一目了然该目录下是实现什么功能的,能更快的找到想要看的一功能模块,也方便自己以后的维护和拓展等...

一个 Go 项目包含 3 大部分:Go应用 、项目管理和文档。Go应用开发过程又分为3阶段:开发、测试、部署。整体来看,我们的目录结构可以按照下图来分类:(仅供参考)

image.png

四、Go目录(根目录)

对目录结构进行一个简单的说明:

1.Go应用

/web

前端代码存放目录。

  • 存放Web 应用程序特定的组件:主要有静态 Web 资源,服务器端模板和单页应用(Single-Page App,SPA)等。

/cmd

存放当前项目的可执行文件

  • cmd 目录下的每一个子目录名称都应该匹配可执行文件。例如,把组件 main 函数所在的文件夹统一放在 /cmd 目录下。
  • 不要在 /cmd 目录中放置太多的代码,我们应该将公有代码放置到 /pkg 中,将私有代码放置到 /internal 中并在 /cmd 中引入这些包,保证 main 函数中的代码尽可能简单和少

/internal

存放私有应用和库代码

  • 如果一些代码,你不希望被其他项目/库导入,可以将这部分代码放至/internal目录下。一般存储一些比较专属于当前项目的代码包。这是在代码编译阶段就会被限制的,该目录下的代码不可被外部访问到。一般有以下子目录:
    • /router 路由
    • /application 存放命令与查询
      • /command
      • query
    • /middleware 中间件
    • /model 模型定义
    • /repository 仓储层,封装数据库操作
    • /response 响应
    • /errmsg 错误处理
  • /internal目录下应存放每个组件的源码目录,当项目变大、组件增多时,扔可以将新增的组件代码存放到/internal目录下
  • internal目录并不局限在根目录,在各级子目录中也可以有internal子目录,也会同样起到作用。

/pkg

存放可以被外部应用使用的代码

  • /pkg目录下时可以被其他项目引用的包,所以我们将代码放入该目录下时候一定要慎重。
  • 在非根目录的下也是可以很好的加入pkg目录,很多项目会在internal目录下加入pkg表示内部共享包库。
  • 个人建议:一开始将所有的共享代码存放在/internal/pkg目录下,当确认可以对外开发时,再转至到根目录的/pkg目录下

/vendor

存放项目依赖

  • 可以通过命令行go mod wendor创建
  • 如果创建的是一个Go库,不要提交wendor依赖包

/third_party

存放放一些第三方的资源工具文件

/test

存放整个应用的测试、测试数据及一些集成测试等,

  • 相较于单元测试在每个go文件对应的目录下,test目录偏向于整体
  • 在某些子项目内也会有局部项目的测试会放在子项目的test中。
  • 需要Go忽略该目录中的内容,可以使用/test/data/test/testdata目录下
  • Go会忽略._开头的目录或文件

/config或/configs

配置文件或者配置文件模板所在的文件夹。

  • 配置中不能携带敏感信息,可用占位符代替

/init

存放初始化系统和进程管理配置文件

/deployments 或 /deploy

存放 IaasPaaS 系统和容器编排部署配置和模板。

2.文档

/README.md

项目的 README 文件一般包含了项目的介绍、功能、快速安装和使用指引、详细的文档链接以及开发指引等

/docs

各类文档所在目录。

  • 存放设计文档、开发文档和用户文档等

 /LICENSE

版权文件

  • 可以是私有的,也可以是开源的。
  • 常用的开源协议有:Apache 2.0MITBSDGPLMozillaLGPL

/api

当前项目对外提供的各种不同类型的 API 接口定义文件

  • 其中可能包含类似 openapi、swagger 的目录,这些目录包含了当前项目对外提供和依赖的所有 API 文件。

/CONTRIBUTING.md

用来说明如何贡献代码,如何开源协同等

  • 规范协同流程
  • 降低第三方开发者贡献代码的难度。

3.项目管理

/Makefile

对项目进行管理

  • 执行静态代码检查、单元测试、编译等功能。

/build

存放安装包和持续集成相关的文件

/website

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

/assets

项目使用的其他资源 (如图片等)。

/tools

存放这个项目的支持工具

  • 这些工具可导入来自 /pkg 和 /internal 目录的代码。

/githooks

Git 钩子。

🎉 放在后面的话

本文总结了一些常见的项目目录结构,希望对大家有一定用处。好的目录结构,总能让人眼前一亮,舒舒服服的看下去。项目的目录结构并没有一个强制性规范,我们应该不断看优秀的项目的结构目录,不断优化自己的架构意识,使得自己项目的扩展性加大的同时还能保证清晰。加油(ง •_•)ง

最后最后最后,个人看法: 对于小项目,可以考虑先包含 /cmd、/pkg、/internal 3 个目录和README.md说明,其他目录后面再按需创建