前言

gomodule
gomodulego vendorgo path
gomodule
go pathgovendorgomodule

这也是我想写一篇文章总结的原因(万一有一天go module也不推荐使用了呢!这种演变的思路值得了解),看过之后保证你能看懂别人文章中写的GOPATH/src、GOPATH/bin、GOPATH/pkg/mod云云,我们开始。

两个命令

go install xxx(下载xxx第三方二进制可执行文件

go get xxx(下载xxx第三方依赖包

下载可执行文件/第三方依赖到本地哪里?不同的包管理工具不同,下面讲。

两个路径

  • GOROOT:go的安装目录,类似java的jdk,存放一些内置的开发包和工具。
  • GOPATH:go指定的工作空间,用于保存go项目的代码和第三方依赖包。

三个包管理工具

go path【不推荐使用】

GOPATH/srcgo build xxxgo install xxxgogetxxxGOPATH/srcGOPATH/binGOPATH/pkg
gogetGOPATH/srcGOPATH
GOPATHgoget会将代码拉取到GOPATH/src

govendor【不推荐使用】

GO15VENDOREXPERIMENTGovendorgo build/vendorvendorvendorGOPATHGOROOT

优势:因为将第三方依赖完全和工程整合,使得项目构建速度快,且可以工作在无法连接外网的CI/CD流程中。

问题:放弃了依赖重用,使得冗余度上升

下载:go install github.com/kardianos/govendor(govendor是第三方可执行文件,下载可执行文件用go install,用go get也行,但是会有告警)。

govendor--help

然后我在govendor的代码库中看到了下面这段话:👇(这个README还是两年前更新的,而且这个库已经很久不维护了,嗯...)。

go module

GOMODULEGOPATH/pkg/modGOPATH/binGOPATH
GOMODULEGOPATHgo.modGOPATH
GOPATH/src

mac:(windows类似)

go mod命令:go help mod查看相关帮助命令(govendor是第三方可执行文件,但是go mod命令是go自带的,不用额外go install)

GO111MODULE=onGOPATH/pkg/modGOPATH/bin

go mod vendor:

GOMODULE

事实上,如果你需要使用vendor模式管理包,说明一定属于如下两种情况:

GOPATHGO MODULE