乐趣区

关于后端:上帝视角看-Go-项目标准布局-之争

大家好,我是煎鱼。

前段时间 Go 语言社区有一件事件引爆了热议,那就是 golang-standards/project-layout 我的项目的“Go 我的项目的规范布局”之争。

没想到,五一假期,认真一看,这个 issues 曾经提出将近一个月了,依然在热议阶段,我想,咱们须要好好的聊聊这个话题。

煎鱼带你理解下的前因后果,再分享我的认识和业务真实情况。

背景

问题发生地

在 GitHub 上有一个我的项目 Spaghetti(github.com/adonovan/spaghetti),是 Go 软件包的一个依赖性剖析工具。

该项目标目录构造如下:

看上去并不简单,代码量不多,文件平铺也不超过一屏,就是一个布局比较简单的我的项目。

有一位老哥提出了一个 PR,明确的冀望该我的项目依照 golang-standards/project-layout 我的项目给出的“规范”布局来调整。:

我猜想该我的项目可能是因为把 Go、HTML、JS、PNG 和 go.mod 文件等摆在了一起,引起了该同学的一丝丝纠结,感觉比拟乱?

“规范布局“长什么样子

golang-standards/project-layout 我的项目中,其自称:

我的项目的组织名也是 “golang-standards”,其提供了一个根本的 Go 我的项目布局,精简展现如下:

project-layout
├── api
├── cmd
├── configs
├── docs
├── go.mod
├── init
├── internal
├── pkg
├── scripts
├── vendor
├── ...
  • /cmd:我的项目次要的应用程序。
  • /internal:公有的利用程序代码库,这些是不心愿被其他人导入的代码。
  • 应用程序理论的代码能够放在 /internal/app 目录(如:internal/app/myapp)。
  • 应用程序的共享代码放在 /internal/pkg 目录(如:internal/pkg/myprivlib)中。
  • /pkg:内部应用程序能够应用的库代码(如:/pkg/mypubliclib)。其余我的项目将会导入这些库来保障我的项目能够失常运行。
  • /vendor:应用程序的依赖关系,可通过执行 go mod vendor 执行失去。
  • /configs:配置文件模板或默认配置。
  • /init:零碎初始化(systemd、upstart、sysv)和过程治理(runit、supervisord)配置。
  • /scripts::用于执行各种构建,装置,剖析等操作的脚本。

更具体的布局介绍,大家能够参见 project-layout 我的项目的 README,其根本把方方面面的目录都思考到了(人多力量大)。

因为内容过于长,因而就不一一展现了。

Russ Cox 现身起因

不过很巧,该项目标作者是前 Google 员工,是 gopl.io 我的项目(5.1k stars)的作者。

在仅仅过来 23 分钟后,作为 GoTeam Leader 的 Russ Cox(@rsc)就现身,并提出新的 issue 表白出了拥护意见:

golang-standards/project-layout 我的项目的 README 中有明确指出这不是官网的规范,有如下宣称:

it is a set of common historical and emerging project layout patterns in the Go ecosystem.

Russ Cox 次要是对宣称 “ 这是一套 Go 生态系统中常见的历史和新兴的我的项目布局模式 ” 这一说法示意了“不精确”的意见。

例如:Go 生态系统中的绝大多数包都不会将可导入的包放在 pkg 子目录中。更宽泛地说,这里形容的只是非常复杂的工程项目,而 Go 的仓库往往要简略得多。

另外,可怜的是,这套我的项目布局在组织名字上被称作 “golang-standards”(Golang 规范)提出来,实际上并非真的是官网规范,有误导的状况存在。

Russ Cox 拥护起因

在理解 project-layout 我的项目所提供的“规范“我的项目布局和 Russ Cox 提出 issues 的背景后。

咱们进一步理解 Russ Cox 认为 这不对 的基本思考。project-layout 这个我的项目有两个问题:

  • 它宣称是 Go 规范(Go standards)的主办方,但实际上并非如此,因为这些规范绝非 Go 官网规范。
  • 它提出的我的项目布局规范过于简单,不是一个正当的规范。

Go 我的项目布局的规范是什么

提出这个 issues 后,呈现了一大堆人诘问 Russ Cox,到底何为 Go 我的项目的布局规范?

Russ Cox 给出了正式回应,一个可导入的 Go repo 的最小规范布局是:

  • 在你的根目录下放一个 LICENSE 文件。
  • 在你的根目录下放一个 go.mod 文件。
  • 将 Go 代码放在 repo 中,放在根目录中,或者依照你认为适合的形式组织成一个目录树。

就这样了,这就是 “ 规范 ”,没有那么简单。不须要像 project-layout 我的项目一样的布局。像是 Go 官网的 golang.org/x 仓库突破了 project-layout 所说的这些 “ 规定 “ 中的每一条。

Go 提案

在经验了长时间的口水战后,曾经有人在 Go 官网仓库提出心愿释出相干的提案(proposal):

猜想可能会有如下几种可能:

  • GitHub 我的项目 golang-standards/project-layout 违心更名,不再自称”golang-standards“,不过可能性比拟低,因为曾经已多人提出,但作者没什么示意。
  • Go 官网正式提供 Go 规范我的项目布局的阐明。
  • Go 官网不做束缚,仅做表态,可能输入文章。

后续大家持续关注该提案,就能够晓得倒退了,传送门:issues #45861。

依照常规,我猜想第三种可能性最大,因为很难有人能够提供所有开发者认可的规范,每个事业部、团队的爱好都可能有所不同。

总结

实际上,任何货色自称“XX 规范”,在名气大后,都会带来一些问题。就像本文提到的 golang-standards/project-layout 我的项目一样。

换位思考一下,若你是某个我的项目的 Leader,某一天你的共事,被人拿着“规范”来倡议批改时,说这是这个我的项目的“规范”,会不会很微妙?

独一无二,我有一个敌人,他们公司早年只有一套 DDD 规范,本想对立。后果前面每一个染指 DDD 的业务同学,都认为前人不规范,每个人都借鉴了一套 DDD 规范。

总是会有小伙伴 想让定义相对的“规范”,又或是“最佳实际”。其实是难以定义的,最好的就是可能一个团队内造成根本共识,这外面牵扯到的不单单只有技术 …

你对此有什么认识呢,欢送在评论区留言和大家一起交换

若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,回复【000】有我筹备的一线大厂面试算法题解和材料。

本文 GitHub github.com/eddycjy/blog 已收录,欢送 Star 催更。

退出移动版