项目布局一
最后更新于:2022-04-02 02:35:56
[TOC]
> [参考](https://github.com/golang-standards/project-layout)
## tree
```
├─api
├─assets
├─build
│ ├─ci
│ └─package
├─cmd
│ └─_your_app_
├─configs
├─deployments
├─docs
├─examples
├─githooks
├─init
├─internal
│ ├─app
│ │ └─_your_app_
│ └─pkg
│ └─_your_private_lib_
├─pkg
│ └─_your_public_lib_
├─scripts
├─test
├─third_party
├─tools
├─vendor
├─web
│ ├─app
│ ├─static
│ └─template
└─website
```
## internal 目录说明
### 实例1:
```
|-- checker
| |-- internal
| | |-- cpu
| | | `-- cpu.go
| | `-- ram
| | `-- ram.go
| `-- server.go
|-- go.mod
|-- go.sum
`-- main.go
```
`checker/internal/cpu`和`checker/internal/ram`只能被`checker`包及其子包中的代码导入,不能被`main.go`导入。当在`main.go`中导入并调用其函数,编译期会报如下错误
只能被`internal/`下同层代码所引用
### 目录概述
## Go 相关目录
### /cmd
该项目的主要应用
具体项目(例如`/cmd/myapp`)
如果该项目不可重用,则放入`/internal`,可重用,放入`/pkg`
### /internal
私有的 application 或者库代码(不希望 package 的接口被扩散到同层目录以外的空间中)
该目录下的代码受限于 Go internal package 机制的限制(见下文),只能被`internal/`下同层代码所引用
此布局模式由Go编译器本身强制执行
不仅限于顶层`internal`目录。`internal`在项目树的任何级别上都可以有多个目录
### /pkg
用来放置库代码,可被项目内部或外部引用
### /vendor
项目依赖代码。`vendor/`下放置着依赖代码的一个副本。如果**项目是库代码,则无需提交依赖代码**
## 服务应用程序目录
### /api
OpenAPI / Swagger规范,JSON模式文件,proto文件,协议定义文件。
## Web应用程序目录
### /web
Web应用程序特定的组件:静态Web资产,服务器端模板和SPA。
## 通用目录
### configs
配置文件或者模版文件
### init/
系统初始化(如 systemd,upstart,sysv)和进程管理(如 runit,supervisord)相关工具的配置。
### scripts
用于执行各种构建,安装,分析等操作的脚本
这些脚本使根级别的Makefile变得小而简单
### /build
包装和持续集成。
### /deployments
IaaS,PaaS,系统和容器编排部署配置和模板(docker-compose,kubernetes / helm,mesos,terraform,bosh)。请注意,在某些存储库中(尤其是使用kubernetes部署的应用程序),此目录称为`/deploy`
### /test
其他外部测试应用程序和测试数据。
随时根据需要构建`/test`目录。对于较大的项目,有一个数据子目录是有意义的。
例如,您可以拥有,`/test/data`或者`/test/testdata`如果需要Go可以忽略该目录中的内容。
请注意,Go还将忽略以 "." 开头的目录或文件或"_",因此您在命名测试数据目录的方式上更具灵活性
## 其他一些目录
### /docs/
设计或者用户文档。
### /tools
项目相关的一些 tool
其代码可引用`pkg/`和`internal/`目录下的 package。
### /examples
项目(应用或者库)相关的示例代码。
### third_party
外部帮助程序工具,分叉的代码和其他第三方工具(例如Swagger UI)。
### githooks
Git hooks.
### /assets
项目相关的其他资源依赖。
### website
放置 网站站点,如 vue,react 写的网站
## 总结
* 确定你要写的项目是 application 还是 library,如果是 application,尽可能有`cmd/`、`pkg/`和`vendor/`目录;如果是 library,可参考上述规则;
* 如果是一个很小的项目,可以不需要所谓的目录设计,尽可能保持清晰简单即可;
';