关于golang:带你了解Go项目标准目录布局

51次阅读

共计 1975 个字符,预计需要花费 5 分钟才能阅读完成。

很多的时候,咱们开发一个简略的 Go 我的项目的时候并不需要纠结于我的项目的的目录布局,因为咱们会将所有 go 源码文件扔在我的项目的根目录中,就像上面这样:

demo
├── main.go
├── model.go
└── service.go

但当咱们的我的项目变得复杂的时候,咱们就须要好好思考怎么组织咱们的我的项目了,这时候你可能会想,用官网的 Go 我的项目目录布局就好了,然而 Go 的官网并没有给出一个规范的 Go 我的项目规范目录布局。

目前,Go 社区开发者比拟举荐的是 project-layout 我的项目中给出的目录布局,如:

demo
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website

然而官网并不举荐这种我的项目布局形式,上面是 Go 团队开发 leader Russ Cox 对 project-layout 目录的意见:

大体上,咱们能够将 Go 的我的项目分为两类,利用我的项目与库我的项目。

  • 利用我的项目:即蕴含可执行文件的我的项目,我的项目开发后,须要编译成可执行文件并上线运行。
  • 库我的项目:库文件个别用于裸露 Api, 被其余我的项目通过 import 关键字引入。

利用我的项目与库我的项目的目录布局形式稍有差别。

利用我的项目

对于利用我的项目,其目录布局形式咱们能够参考 Go 我的项目本身,以及一些应用 Go 语言开发的优良开源我的项目 (如 Docker,Kubernetes,etcd) 等,通过钻研这些我的项目的目录布局,咱们能够形象出以下规范目录:

demo
├── cmd
│   ├── app1
│   │   └── main.go
│   └── app2
│       └── main.go
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
├── pkg2
│   └── pkg2.go
└── vendor

cmd

可执行文件目录,如果一个我的项目有多个可执行文件,能够放在不同的子目录中,如下面例子中的 app1 和 app2 目录。

internal

我的项目外部公有代码,其余我的项目引入时会报错。

pkgN:

留神,这里并不是说肯定要 pkg 为前缀来命名,你能够对取任意合乎包命名标准的名称,比方 service,model 等

即下面示例中的 pkg1 与 pkg2,pkgN 包与 internal 包一样寄存我的项目的依赖代码,但存储在这里的代码,能够被其我的项目引入。

vendor

这个目录用于存储我的项目的依赖包,但因为现今 Go 我的项目都是应用 go module 进行依赖治理,因而这个目录是可省略的。

如果咱们的我的项目只有一个可执行文件,能够将 main.go 文件间接写在根目录,而 vendor 能够省略,因而,我的项目目录能够进一步精简为:

demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── main.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

库我的项目

库我的项目不须要可执行文件,相比于利用我的项目,省略了 cmd 目录,其规范目录下:

demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

如果咱们的库我的项目比较简单,能够采纳平铺式我的项目布局,行将所有的性能写在一个包里,所有源码目录放在根目录下,如:

demo
├── feature1.go
├── feature2.go
├── feature3.go
├── go.mod
└── go.sum

平铺式的我的项目布局非常适合简略的库我的项目,事实上,很多简单的库我的项目也会将大量的代码放在根目录下,因为这样,其余我的项目应用 import 引入我的项目的包时,门路会比拟短,比方咱们有一个构造体 A,放在 pkg1 包下与放在根目录下,其引门路别离是:

import "demo"

import "demo/pkg1"

小结

好了,浏览到这里,想必你曾经理解了 Go 利用我的项目与库我的项目目录布局的不同了吧。

不过,因为 Go 官网我的项目指定的我的项目布局,因而上述的几种我的项目目录都是社区开发的约定俗成,并不具备强制性,你也能够定制本人的 Go 我的项目目录布局,不过我想,应用社区开发都遵循的目录标准,还是有助于升高团队开发人员的认知与交换老本的。

正文完
 0