本文介绍Golang的工程管理。
GOPATH目录下创建三个目录:
golang 查找依赖包路径:
当前目录下的vendor目录。
向上级目录查找,直到找到src下的vendor目录。
在 GOPATH 下面查找依赖包。
在 GOROOT 目录下查找。
依赖包有几大各类:
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 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
使用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
其它命令:
查看工程依赖包工具。
下载安装:
go get -v -u github.com/gpmgo/gopm
用法:
# 查看当前工程依赖
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等,具体根据提示来安装即可)
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 // 文档需要
在VS code中打开go文件,右下角提示goreturns要安装(具体提示未记录),点击安装。
当保存go文件时会自动检测语法,并提示。
1、Go项目结构推荐。
李迟 2020 上半年 起稿并修改 2020.08.20 周四 修改