Go 项目标准布局(结构)

https://github.com/golang-standards/project-layout 项目总结了 Go 项目的布局,这是Go应用程序项目的基本布局,并不是Go核心开发团队定义的官方标准;但是,这是Go生态系统中的一种常见的项目布局模式。

Go的目录

/cmd

该目录用于存放 Go 项目的入口,即 main.go。一般来说,我们应该在 cmd 目录下创建子目录,子目录名称代表可执行程序的名称(例如/cmd/myapp)。上面列出的优秀开源项目基本上遵循了这一规则。
一般来说,该目录中的代码应该尽可能少。如果认为该代码可以导入并在其他项目中使用,那么它应该位于/pkg目录中。如果该代码不可重用,或者不希望其他人重用它,则将该代码放在/internal目录中。
通常有一个小的main函数可以导入和调用/ internal和/ pkg目录中的代码而不是其他内容。 有关示例,请参阅/ cmd目录。

/internal

这是 Go 包的一个特性,放在该包中的代码,表明只希望项目内部使用,是项目或库私有的,其他项目或库不能使用。请注意,不限于顶层internal目录,internal在项目树的任何级别上都可以有多个目录。
可以选择向内部包中添加一些额外的结构,以分隔共享和非共享内部代码。它不是必需的(尤其是对于较小的项目),但是最好有视觉提示来显示包的用途。实际应用程序代码可以进入/internal/app目录(例如/internal/app/myapp),而这些应用程序共享的代码可以进入/internal/pkg目录(例如/internal/pkg/myprivlib)。

/pkg

可以由外部应用程序使用的库代码(例如,/ pkg / mypubliclib)。其他项目将导入这些库,期望它 们可以工作,所以在你把东西放在这里之前要三思而后行:­)
当你的根目录包含许多非Go组件和目录时,它也可以在一个地方将Go代码分组,从而更容易运行 各种Go工具(如GopherCon EU 2018的工业编程佳实践中所述)。
如果要查看哪个流行的Go repos使用此项目布局模式,请参阅/ pkg目录。这是一种常见的布局模 式,但它并未被普遍接受,Go社区中的一些人不推荐它。

/vendor

应用程序依赖项(手动管理或由您喜欢的依赖管理工具(如dep)管理)。
如果要构建库,请不要提交应用程序依赖项。GO1.13启用go module来代替,并不需要vendor目录了。

服务应用程序目录

/api

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

Web应用程序目录

/web

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

常见应用程序目录

/configs

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

/init

系统初始化(systemd,upstart,sysv)和进程管理器/主管(runit,supervisord)配置。

/scripts

脚本执行各种构建,安装,分析等操作。
这些脚本使根级Makefile保持简洁(例如, https://github.com/hashicorp/terraform/blob/master/Makefile)。
有关示例,请参阅/ scripts目录。

/build

打包和持续集成。
将您的云(AMI),容器(Docker),OS(deb,rpm,pkg)包配置和脚本放在/ build / package 目录中。
将CI(travis,circle,drone)配置和脚本放在/ build / ci目录中。请注意,某些CI工具(例如, Travis CI)对其配置文件的位置非常挑剔。尝试将配置文件放在/ build / ci目录中,将它们链接到CI 工具所期望的位置(如果可能)。

/deployments

IaaS,PaaS,系统和容器编排部署配置和模板(docker­compose,kubernetes / helm,mesos, terraform,bosh)。

/test

一般用来存放除单元测试、基准测试之外的测试,比如集成测试、测试数据等。您可以随意构建/ test目录。对于更大的项目,有一个数据子目录是 有意义的。例如,如果需要Go忽略该目录中的内容,可以使用/ test / data或/ test / testdata。请注 意,Go也会忽略以“.”开头的目录或文件。或“_”,因此您在命名测试数据目录方面具有更大的灵活 性。
有关示例,请参阅/ test目录。

其他目录

/docs

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

/tools

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

/examples

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

/third_party

外部帮助工具,分叉代码和其他第三方实用程序(例如,Swagger UI)。

/githooks

Git hooks.

/assets

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

/website

如果您不使用Github页面,这是放置项目的网站数据的地方。
有关示例,请参阅/ website目录。

你不应该有的目录

/src

一些Go项目确实有一个src文件夹,但它通常发生在开发人员来自Java世界时,它是一种常见的模 式。如果您可以帮助自己尝试不采用此Java模式。你真的不希望你的Go代码或Go项目看起来像 Java :­)
不要将项目级别/ src目录与Go用于其工作空间的/ src目录混淆,如如何编写Go代码中所述。 环境变量指向您的(当前)工作空间(默认情况下,它指向非 系统上的 HOME / go)。此工作空间包括顶级/ pkg,/ bin和/ src目录。您的实际项目终成为/ src下的子目录,因此 如果项目中有/ src目录,项目路径将如下所示:/ some / path / to / workspace / src / your_project / src / your_code。请注意,使用Go 1.11可以将项目置于GOPATH之外,但这并不意味着使用此布 局模式是个好主意。

Badges

Go Report Card­它将使用gofmt,go vet,gocyclo,golint,ineffassign,license和misspell扫描你 的代码。将github.com/golang-standards/project-layout替换为您的项目参考。
GoDoc ­ 它将提供GoDoc生成文档的在线版本。更改链接以指向您的项目。
Release­它将显示项目的新版本号。更改github链接以指向您的项目。

脚注

具有可复用的配置,脚本和代码的更具见解性的项目模板是WIP。

用于组织项目的非官方模式集