工程概述
GOPATH目录下创建三个目录:
- src 存放源代码,每个工程一个单独的目录
- pkg 编译过后生成的包文件存放目录,根据平台有不同目录,里面有许多.a库,暂未研究。
- bin 编译后生产的可执行文件和go相关的工具
工程管理
golang 查找依赖包路径:
当前目录下的vendor目录。
向上级目录查找,直到找到src下的vendor目录。
在 GOPATH 下面查找依赖包。
在 GOROOT 目录下查找。
依赖包有几大各类:
1 | github.com:位于 github.com 上的仓库。 |
(理论上可创建自定义的名称,不一定要存在,但无法用 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 | go mod init // 创建go.mod文件 |
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 | # 查看当前工程依赖 |
swagger
1 | go get -u github.com/swaggo/swag/cmd/swag |
格式检查vet
在VS code中打开go文件,右下角提示goreturns要安装(具体提示未记录),点击安装。
当保存go文件时会自动检测语法,并提示。
参考资源
1、。
李迟 2020 上半年 起稿并修改 2020.08.20 周四 修改