依赖管理
在go 1.11以前相,相信GOPATH一直被广大gopher所诟病。
go mod出现以后,我们不必再被GOPATH所束缚,go mod将带给你更好的依赖包管理体验。
如果你想体验能go mod,可以在GOPATH/src之外建一个项目仓库。
实战
首先在GOPATH/src 之外建项目目录
然后初始化gomod依赖文件
go mod init gin_tutorial
说明 go mod 初始化成功了,会在当前目录下生成一个 go.mod 文件。
包含go.mod文件的目录也被称为模块根,意味着go.mod 文件的定义了它所在的目录为一个模块。
经过上述步骤,我们已经可以进入开发了,我们在main文件中引入一个外部包:
package main
import (
"fmt"
"github.com/beevik/etree"
)
func main(){
doc := etree.NewDocument()
fmt.Println(*doc)
}
运行之后会生成一个文件go.sum,它记录所依赖的项目的版本的锁定。
go.sum文件内容
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
此时go.mod 也多了一行内容
module tutorial
go 1.12
require github.com/beevik/etree v1.1.0 // indirect
接下来在项目中创建一个子目录,并在main中引入该包的内容,需要使用包内的绝对路径
package main
import (
"fmt"
"github.com/beevik/etree"
"tutorial/tools"
)
func main(){
doc := etree.NewDocument()
fmt.Println(*doc)
tools.Foo()
}
“tutorial/tools” 导入这个包的地方是 模块内的绝对路径,就是要从go.mod所在的目录开始。
注意:如果你使用的是GoLand,确保选项中打开了go modules选项
另外,如果我们想把这个项目放到GOPATH下面,不使用go mod模式,而是想使用GOPATH模式的话,,只需要把这个项目移到GOPATH环境变量包含的任意一个目录下面的src目录里,就可以启用GOPATH模式了。
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
- 当前目录在GOPATH/src之外且该目录包含go.mod文件
- 当前文件在包含go.mod文件的目录下面。
有时可能遇到依赖包拉不下来的问题
这里可以设置go mod的微软代理
export GOPROXY="https://athens.azurefd.net"
export GO111MODULE=on
亲测可用