普通项目和库类型项目的目录结构分别长什么样,这一篇对照着看。
普通项目目录结构
普通项目通常是一个完整的应用程序,包含多个可执行文件和相应的资源文件。
myproject/
├── cmd/
│ └── myapp/
│ └── main.go
├── pkg/
│ └── mypackage/
│ ├── mypackage.go
│ └── mypackage_test.go
├── internal/
│ └── myinternalpackage/
│ ├── myinternalpackage.go
│ └── myinternalpackage_test.go
├── api/
│ ├── api.go
│ └── api_test.go
├── web/
│ ├── static/
│ └── templates/
├── configs/
│ └── config.yaml
├── scripts/
│ └── build.sh
├── deployments/
│ └── docker/
│ └── Dockerfile
├── test/
│ └── e2e/
│ └── e2e_test.go
├── docs/
│ └── README.md
├── tools/
│ └── tools.go
├── examples/
│ └── example.go
└── go.mod
└── go.sum文件夹及其作用
cmd/
存放应用程序的入口文件。每个子目录代表一个独立的可执行程序。
main.go: 包含main函数,程序的入口点。
pkg/
公共的库代码,对外可见,可以被其他项目使用。
mypackage/: 包含可以被项目和外部使用的包代码和测试代码。
internal/
私有的库代码,仅在该项目内可见。防止其他项目意外依赖这些代码。
myinternalpackage/: 包含私有的包代码和测试代码。
api/
API 相关的代码,可能包括协议定义、API 处理逻辑等。
api.go: API 相关的实现。api_test.go: API 相关的测试。
web/
Web 相关的资源文件。
static/: 静态资源文件,如 JavaScript、CSS、图片等。templates/: HTML 模板文件。
configs/
配置文件,存放项目的各种配置,如 YAML、JSON 文件等。
config.yaml: 配置文件示例。
scripts/
各种构建、部署、自动化脚本。
build.sh: 构建脚本示例。
deployments/
部署相关的文件和配置,如 Docker 配置文件、Kubernetes 配置文件等。
docker/: 包含 Docker 相关的配置文件。Dockerfile: Docker 构建文件。
test/
测试相关的代码和资源,特别是端到端(E2E)测试。
e2e/: 端到端测试代码。e2e_test.go: 端到端测试示例。
docs/
项目文档,可能包括 README 文件、API 文档等。
README.md: 项目的主要文档。
tools/
工具代码和脚本,可能包括开发和构建工具。
tools.go: 工具相关代码。
examples/
示例代码,展示如何使用项目中的包和函数。
example.go: 示例代码,展示项目的功能。
go.mod 和 go.sum
Go 模块管理文件。
go.mod: 定义模块路径、依赖版本等。go.sum: 记录模块依赖的具体版本和校验和。
库类型项目目录结构
库类型项目主要是提供可以被其他项目依赖和使用的库代码,其结构会有所不同,着重于代码的复用和文档。
mylibrary/
├── pkg/
│ └── mylibrary/
│ ├── mylibrary.go
│ └── mylibrary_test.go
├── internal/
│ └── myinternal/
│ ├── myinternal.go
│ └── myinternal_test.go
├── examples/
│ └── example.go
├── docs/
│ └── README.md
├── test/
│ └── e2e/
│ └── e2e_test.go
├── tools/
│ └── tools.go
└── go.mod
└── go.sum文件夹及其作用
pkg/
公共的库代码,对外可见,可以被其他项目使用。
mylibrary/: 包含可以被项目和外部使用的库代码和测试代码。
internal/
私有的库代码,仅在该项目内可见。防止其他项目意外依赖这些代码。
myinternal/: 包含私有的库代码和测试代码。
examples/
示例代码,展示如何使用库中的包和函数。
example.go: 示例代码,展示库的功能。
docs/
项目文档,可能包括 README 文件、API 文档等。
README.md: 项目的主要文档。
test/
测试相关的代码和资源,特别是端到端(E2E)测试。
e2e/: 端到端测试代码。e2e_test.go: 端到端测试示例。
tools/
工具代码和脚本,可能包括开发和构建工具。
tools.go: 工具相关代码。
go.mod 和 go.sum
Go 模块管理文件。
go.mod: 定义模块路径、依赖版本等。go.sum: 记录模块依赖的具体版本和校验和。
说明
这套结构真正起作用的是两点。一是可见性:pkg/ 里的代码别的项目能 import,internal/ 里的只有本项目能用,Go 工具链直接强制这条线。二是找东西快:入口在 cmd/,脚本在 scripts/,部署清单在 deployments/,按目录名就能定位。加上它是社区常见布局,别人读你的仓库不费劲。
这种结构是一个推荐的起点,可以根据项目的具体需求进行调整。