项目布局一

最后更新于: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,可参考上述规则; * 如果是一个很小的项目,可以不需要所谓的目录设计,尽可能保持清晰简单即可;
';