Golang实践录:工程管理

本文介绍Golang的工程管理。

工程概述

GOPATH目录下创建三个目录:

  • src 存放源代码,每个工程一个单独的目录
  • pkg 编译过后生成的包文件存放目录,根据平台有不同目录,里面有许多.a库,暂未研究。
  • bin 编译后生产的可执行文件和go相关的工具

工程管理

golang 查找依赖包路径:
当前目录下的vendor目录。
向上级目录查找,直到找到src下的vendor目录。
在 GOPATH 下面查找依赖包。
在 GOROOT 目录下查找。

依赖包有几大各类:

1
2
3
4
5
github.com:位于 github.com 上的仓库。  
golang.org:golang官方包
gopkg.in:
google.golang.org:
k8s.io:k8s相关的

(理论上可创建自定义的名称,不一定要存在,但无法用 go get 获取。)

笔记三

根据实际情况和路径,在 src 先创建目录。可不按 github.com 之类。说明:
许多开源项目托管于 github.com 上,且依赖其它同样托管在 github 的项目。因此要在 src 下创建 github.com 目录,如 kubeedge 项目,其路径为:github.com\kubeedge\kubeedge 。cobra 项目路径 为 github.com\spf13\cobra,等等。
k8s 项目使用的路径为 k8s.io/kubernetes 。这些路径,一般规定好,写到官方文档。
内部项目,可自定义路径目录,只要与源码保持一致即可。
项目依赖的包,放到项目的 vendor 中,随项目托管。

笔记二

针对第三方依赖包的讨论:
对于小工具或测试模块,不同模块,可能使用同一依赖包,故将依赖包下载到 src 目录,以便共用。事实上,依赖包大目录基本为上述几个,大目录不会杂乱。
对于大工程和项目,可将依赖包纳入版本管理,也可不纳入。前者仓库体积可能变大,但方便使用,无须再下载依赖包。后者仓库体积小,但需要使用者额外下载,有可能无法成功下载依赖包。此为矛盾之处。二者均可,取决于团队决策。个人偏向将依赖包进行版本管理,虽然体积大,但“开箱即用”,减少后来者工作。

笔记一

不同的包,单独成目录,放到src目录。将GOPATH放到大的版本管理。如本地测试文件,可不提交管理。
对于可公开的库,直接提交到的github.com上,在单独目录做测试(可直接运行的)。
在src新建foo目录,foo有main.go,另有vendor子目录,vendor有uitls目录,即为utils包,实现模块。在main.go中引用utils包即可。

我的golang工程:为方便编写代码,而不显得目录混乱,又能与其它工程区别开。新建 go_test 项目目录,其下有vendor子目录,vendor 即为该项目所依赖的自编模块(注:外部依赖不在此列),其下可有各个模块,如utils目录,即为utils包,目录下文件名可不同,实现函数不同,但均属于 utils 包。同时,vendor有mybuff、mylog等包(目录)。由于部分功能可能与第三方库相同,可添加my为前缀,以示区别。

该目录放到任意目录均可。这样,go_test 工程可单独使用,同理,还有其它工程。

再注:
公司项目根目录只能位于GOPATH,其下bin/pkg/src目录,还有readme和其它配置文件。src有自编模块(目录),也有github.com golang.org gopkg.in(但这些放到.gitignore忽略了)。为与公司兼容,将自己的测试工程放到src下的vendor中,再将vendor忽略。

工程目录概述

参考 的说明。

go mod 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
go mod init  // 创建go.mod文件

后可用go build直接编译,如果不存在的包,会自动下载(测试了github.com等地址),下载地址为GOPATH/pkg。
如何下载到本工程的vendor下?
矛盾之处:工程本身在github.com下开发,未提交版本,但go guild时会查找,找不到,报错。

go mod download
下载依赖,默认pkg目录(可共用)

go mod tidy
同步依赖包,添加需要的,移除多余的

go mod vendor
将依赖包拷贝到vendor目录

go get 下载/升级依赖

.mod所在目录:
go build -mod vendor main.go


go env -w GO111MODULE=off auto on

govendor使用

使用go get下载的第三方包,会下载到src目录下。

下载govendor并安装:go get -u -v github.com/kardianos/govendor
下载包到vendor目录:govendor fetch github.com/golang/glog。(注:自动下载该包相关的依赖包)
添加包到vendor目录:govendor add github.com/golang/glog
删除包:govendor remove github.com/golang/glog
其它命令:

gopm使用

查看工程依赖包工具。

下载安装:

1
go get -v -u github.com/gpmgo/gopm

用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 查看当前工程依赖
gopm list
# 显示依赖详细信息
gopm list -v
# 列出文件依赖
gopm list -t [file]
# 拉取依赖到缓存目录
gopm get -r xxx
# 仅下载当前指定的包
gopm get -d xxx
# 拉取依赖到$GOPATH
gopm get -g xxx
# 检查更新所有包
gopm get -u xxx
# 拉取到当前所在目录
gopm get -l xxx
# 运行当前目录程序
gopm run
# 生成当前工程的 gopmfile 文件用于包管理
gopm gen -v
# 根据当前项目 gopmfile 链接依赖并执行 go install
gopm install -v
# 更新当前依赖
gopm update -v
# 清理临时文件
gopm clean
# 编译到当前目录
gopm bin

3. 通过gopm 来安装gin框架

gopm get -g -v  github.com/gin-gonic/gin

4. 安装govendor管理包工具

 gopm get -g -v github.com/kardianos/govendor

5. 通过 govendor 来管理代码包

6. go run main.go文件,可能会出现缺少golang.org/x,提示报错

/root/gowork/src/attendance_project/vendor/golang.org/x/sys/unix (vendor tree)
/usr/local/src/go/src/golang.org/x/sys/unix (from $GOROOT)
/root/gowork/src/golang.org/x/sys/unix (from $GOPATH),

通过 gopm -g golang.org/x/sys (sys只是其中的一个模块,例如:text,sys等,具体根据提示来安装即可)

swagger

1
2
3
4
5
6
go get -u github.com/swaggo/swag/cmd/swag
(所遇问题:golang.org\x目录的tools和net的git版本有点旧,会自动更新,但连接不上,解决:先删除,从Github.com上下载)

go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/gin-swagger/swaggerFiles
go get -u github.com/alecthomas/template // 文档需要

格式检查vet

在VS code中打开go文件,右下角提示goreturns要安装(具体提示未记录),点击安装。
当保存go文件时会自动检测语法,并提示。

参考资源

1、。

李迟 2020 上半年 起稿并修改 2020.08.20 周四 修改

  • 本文作者:李迟
  • 版权声明:原创文章,版权归署名作者,转载建议注明出处(当然不注明亦可)。
  • 本文链接:/golang/golang-project-manage.html