文档章节

Go语言编程 — 项目规范

o
 osc_hdksnrrg
发布于 07/12 11:42
字数 1515
阅读 34
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

目录

项目布局(Project Layout)规范

注意,本文列举的目录为项目顶层子目录清单。

官方标准:https://github.com/golang-standards/project-layout

├── .gitignore
├── LICENSE.md
├── Makefile
├── README.md
├── go.mod
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website

程序核心代码目录

/cmd(Command)

存放 Golang 项目的若干个程序的可执行文件(e.g. /cmd/app/main.go)。项目下每个程序目录的名字应该和程序可执行文件的名字保持一致。

参考:https://github.com/golang-standards/project-layout/blob/master/cmd/README.md

一般来说程序的 main() 函数不要编写太多代码。如果这些代码会被其他程序引用,那么应该编写在 /pkg 目录中;如果这些代码不能被重用,或者不希望别人重用,那么这些代码应该编写在 /internal 目录中。然后在 main() 函数中导入并执行即可。

/pkg(Package)

存放可以被其他项目引用的代码。通常是程序的核心逻辑代码或通用 lib 库。其他项目的程序可以通过 import 来引入这里的代码。

所以当我们将代码放入 pkg 时一定要慎重,考虑清楚这些代码是否应该被 “公开”。

/internal

存放当前项目内部(Internal)私有的程序和库的代码。这里的代码不希望被外部项目所引用。当我们在其他项目引入包含 internal 的依赖时,Golang 会在编译时报错:

An import of a path containing the element “internal” is disallowed
if the importing code is outside the tree rooted at the parent of the "internal" directory.

内部程序的代码应该存放在 /internal/app 子目录下,同时这些内部程序锁依赖的代码库应该在 /internal/pkg 子目录和 /pkg 中。e.g.

在这里插入图片描述

/vendor

存放程序的外部依赖。可以手工管理,也可以使用 Golang 提供的 dep 工具(https://github.com/golang/dep)。

常规目录

/configs

存放配置文件的模板(e.g. consul-template)或者默认配置文件(e.g. confd)

/init

存放系统初始化(e.g. systemd、upstart、sysv)以及进程管理或者进程监控(e.g. runit、supervisord)的配置

/scripts

存放执行各种构建、安装、分析等,或者其他操作的脚本文件

参考:https://github.com/golang-standards/project-layout/blob/master/scripts/README.md

/build

存放打包及持续集成所需要的的文件

  • 将 cloud(AMI)、container(Docker)、OS(deb、rpm、pkg)软件包的配置放在 /build/package 目录下。
  • 将 CI(travis、circle、drone)系统的配置和脚本放在 /build/ci 目录下。需要注意的是,有些 CI 工具(e.g. Travis CI)对它们的配置文件的位置非常敏感。此时,我们可以把配置文件放在 /build/ci 目录下,然后将它们软链接到 CI 工具希望它们出现的位置路径。

/deployments

存放 IaaS、PaaS、系统,以及容器编排的部署配置文件和模板文件。例如:docker-compose、kubernetes/helm、mesos、terraform、bosh 等。

/test

存放程序的单元测试程序,以及测试数据

对于大型的项目则有必要包含一个 /test/data 子目录,Golang 会忽略其中的某些内容。例如:/test/data 或者 /test/testdata 目录。

注意,Golang 还会忽略任何以 “.” 和 “_” 开头的文件和目录。

参考:https://github.com/golang-standards/project-layout/blob/master/test/README.md

Makefile

Makefile 定义了项目编译的细节,并且 /scripts 目录下的脚本文件通常由 Makefile 触发。

Service(服务端)应用目录

/api

存放项目对外提供的若干个北向 API 接口的定义文件。包括:OpenAPI/Swagger 的规范(Specs)文件、JSON schema 文件,以及协议定义文件。例如: /api/protobuf-spec、/api/thrift-spec 或者 /api/http-spec 目录,这些目录中包含了当前项目对外提供的和依赖的所有 API 文件:

$ tree ./api
api
└── protobuf-spec
    └── oceanbookpb
        ├── oceanbook.pb.go
        └── oceanbook.proto

其中,创建 oceanbookpb 二级目录的主要作用在于一个项目同时提供了多种不同的访问方式时,这样可以避免潜在的冲突问题,也更加清晰。

参考:https://github.com/golang-standards/project-layout/blob/master/api/README.md

Web 应用目录

/web

存放 Web 应用的标准组件

  • 静态 Web 资源
  • 服务端模板
  • 单页应用

其他目录

/docs

存放除了使用 godc 自动生成的程序文档文件之外的文档资料,例如:用户及设计文档

参考:https://github.com/golang-standards/project-layout/blob/master/docs/README.md

/tools

存放项目需要工具集。这些工具可以引入 /pkg 和 /internal 目录下的代码。

参考:https://github.com/golang-standards/project-layout/blob/master/tools/README.md

/examples

存放程序示例文件

参考:https://github.com/golang-standards/project-layout/blob/master/examples/README.md

/third_party

存放第三方辅助工具、forked 代码。例如:Swagger UI。

/githooks

存放 Git books 文件

/assets

存放其他资产(assets)文件,通常是图片、logo 等文件

website

如果你不用 Github pages 的话,可以在这里放置项目的站点文件。通常是用于项目宣传和展示的网站资料

参考:https://github.com/golang-standards/project-layout/blob/master/website/README.md

不建议使用的目录

/src

注意,这里所说的 /src 目录指的是 “项目顶层” 的 /src,而不是 “Go workspace” 的 /src 目录。

$GOPATH 环境变量指向当前环境中的 Go workspace,在 UNIX-like 操作系统中通常是 $HOME/go。笔者的配置为:

$ echo $GOPATH
/Users/mickeyfan/workspace/go

这个 workspace 的顶层包括了 /pkg、/bin 和 /src 目录,Golang 项目在默认情况下都会被放置到 $GOPATH/src 目录下,存储着我们开发和依赖的全部项目代码。

所以,如果我们在实际项目的顶层定义了 /src 目录,那么该项目的 $GOPATH 中就会出现两个 src,e.g.

/some/path/to/workspace/src/your_project/src/your_code.go。

所以,不建议在项目的顶层创建 /src 子目录,区别于 JAVA 的编程习惯。

o
粉丝 0
博文 75
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
极速博客引擎--Gor

gor 是使用 golang 实现的类Ruhoh静态博客引擎(Ruhoh like),基本兼容ruhoh 1.x规范. 相当于与ruhoh的官方实现(ruby实现), 有以下优点: 速度完胜 -- 编译wendal.net近200篇博客,仅需要1秒 安装...

wendal
2013/01/20
3.8K
0
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0
全新Web编程的js框架--Flapjax

Flapjax是一种全新的、为满足基于客户端的Web应用的需求而设计的一种js框架。其主要特点包括: 事件驱动, 反应评价 基于web service的事件流抽象 提供web service扩展接口 Flapjax简单易学:...

匿名
2013/04/05
778
0
图形化的 IDE--LiveCode

LiveCode是一个图形化的IDE,允许用户通过拖放控件并编写代码,来创建桌面或移动应用程序(支持Windows、Mac OS、Linux、iOS和Android平台)。LiveCode受苹果HyperCard的启发,采用一种基于英...

匿名
2013/04/12
7.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Git历史记录中grep(搜索)已提交的代码 - How to grep (search) committed code in the Git history

问题: I have deleted a file or some code in a file sometime in the past. 我过去某个时候已经删除了文件或文件中的某些代码。 Can I grep in the content (not in the commit messages)......

技术盛宴
31分钟前
9
0
二进制安装安装mysql 8.0.20

MySQL最新版本8.0.20正式发布。与之前8.0的系列版本一样,这次的发行版除了包含缺陷修复,也同样包括新功能。下面快速浏览一下。关键字:hash join、InnoDB双写缓冲、二进制日志事务压缩。 ...

程序员面试吧
35分钟前
18
0
关于python3.8+ pyside2 pyinstaller打包的一些坑

环境: python 3.8 pyinstaller 3.6 pyside2 5.14 打包过程中出现错误(1):   7607 WARNING: lib not found: pywintypes38.dll dependency of c:\users\have_\appdata\local\programs\pyth......

齐勇cn
35分钟前
11
0
备战秋招!静电的UI设计教室全能课程开始招生~系统进阶!提升核心竞争力

。 本文分享自微信公众号 - 静Design(JingDesign91)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

静电1983
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部