Go项目标准布局
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或consultemplate模板文件放在这里。
/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,系统和容器编排部署配置和模板(dockercompose,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。
用于组织项目的非官方模式集
- cookiecutter-golang - Go应用样板模板,用于遵循生产最佳实践快速启动项目。
- go-sample - 具有实际代码的Go应用程序项目的示例布局。
- golang-standards/project-layout - Go生态系统中常见的历史和新兴项目布局模式集。
- modern-go-application - Go应用程序样板和应用现代实践的示例。
- scaffold - 脚手架生成入门Go项目布局。让您专注于已实现的业务逻辑。
- golang-web-layout - Golang Web工程结构(echo)