使用 PHP 作为开发语言的同学都知道,最初引用外部类库包时需要一个个下载,然后再一个个手动导入;如果使用的外部类库中还有引用的类库万一没在包里,还得去找对应的类库包,然后再导入,非常麻烦;幸好后来有了 composer,所有的类库包都是集中式管理的,在一个地方就可以找到并一键下载引用,极大地方便了类库包的引用。
在 Go 语言中,第三方依赖的管理工具经过了一个漫长的发展过程。在 Go 1.11 发布之前 govendor、dep 等工具百花齐放。直到 Go mod 出现,开始一统天下。
在这之前 Go 的依赖非常简单粗暴,只要依赖源码就可以了。例如:
import "github.com/jinzhu/gorm"
github.com/jinzhu/gorm 就是 gorm 的GitHub项目路径。
GOPATH时期Go 在1.11 之前使用GOPATH模式进行依赖的管理。安装部署 Go 环境,使用 Go 进行开发的时候强制被要求要设置GOPATH(当然安装过程中也会默认指定$GOPATH=~/go)。 要在GOPATH路径下新建 src /bin /pkg文件夹。
➜ ~/go ├── bin # 存储go编译生成的二进制可执行文件,一般会把该路径配置到PATH中,PATH=$PATH:$GOPATH/bin ├── pkg # 存储预编译的目标文件,以加快后续的编译速度 └── src # 存储Go的源代码,一般以$GOPATH/src/github.com/foo/bar的路径存放 ➜ go go env |grep GOPATH GOPATH="/Users/bytedance/go"
在这种模式下,如果使用go get 拉取外部依赖会自动下载并安装到$GOPATH/src 目录下。
这种模式下,go get没有版本管理的概念,无法处理依赖不同版本的问题,因为同一个依赖都存在同一个路径下面。
在 Go 官方还没有推出 Go Modules 的时候,go的依赖管理工具可谓是百花齐放,例如 govendor, dep,但是最终Go Modules发布,平息了诸侯割据的局面。
GO ModulesGo1.11 开始推出 Go Modules , Go1.13 开始不再推荐使用 GOPATH。意思就是说你可以在任何路径下存放你的Go 源码文件, 不用再像以前一样非得放到$GOPATH/src中。 每一个 Go 项目 都是一个 Modules。
在 Go Modules 环境下出现了一个很重要的环境变量GO111MODULE
➜ ~ go env GO111MODULE="auto" GOPROXY="https://proxy.golang.org,direct" GONOPROXY="" GOSUMDB="sum.golang.org" GONOSUMDB="" GOPRIVATE="" . . .
如果要对go 的环境变量进行设置,可以使用
go env -w GO111MODULE=on # 设置go 环境变量 go env -u # 恢复初始设置GO111MODULE
GO111MODULE 这个环境变量是用来作为使用Go Modules 的开关。可以说这个变量是历史产物,很有肯能会在将来Go的新版本中去除掉。
GO111MODULE="auto" # 只要项目包含了go.mod 文件的话就启用Go modules, 在Go1.11-1.14 中是默认值 GO111MODULE="on" # 启用Go Modules GO111MODULE="off" # 禁用Go Modules, 对老的项目进行兼容go mod
// 操作 go mod 的命令有
➜ ~ go mod
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
# 所有的go commands 都支持 modules。
Usage:
go mod [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
Use "go help mod " for more information about a command.
go mod init
在当前目录初始化一个新的module, 就是说将该目录下的工程文件初始化为一个Go Module.
// 如果当前目录在GOPATH中,这条命令无需传入参数,参数默认为 GOPATH/src 到该目录的相对路径。中 go mod // 如果当前目录不在GOPATH中,要手动指定module的名字 go mod gomod
mod 创建完成之后,就可以在该目录下创建 Go 文件,然后运行起来了,如:
// 创建 hello.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
然后直接 go run hello.go
参考链接



