一句话简介
GVM(Go Version Manager)
下载多版本golang到本地缓存,通过切换环境变量指向不同的Golang版本
Go mod
对 go modules 的依赖管理,使得不同项目中依赖不同版本的同一个库更简单。
进一步介绍
GVM配置环境变量的原理
gvm
配置路径1
2
3cat /Users/name/.gvm/scripts/gvm
export GVM_ROOT=/Users/name/.gvm
. $GVM_ROOT/scripts/gvm-defaultgvm
配置后的 golang 环境变量1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/name/Library/Caches/go-build"
GOENV="/Users/name/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/name/.gvm/pkgsets/go1.13.10/global" #路径带了版本标识: go1.13.10
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/name/.gvm/gos/go1.13.10" #路径带了版本标识: go1.13.10
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/name/.gvm/gos/go1.13.10/pkg/tool/darwin_amd64" #路径带了版本标识
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/k2/sl1g0vys41q4msqx6hd40_hh0000gn/T/go-build407280275=/tmp/go-build -gno-record-gcc-switches -fno-common"从上面的
go env
配置可以看到,通过 gvm 管理的 golang 关键环境变量都带上了golang的版本标识GOPATH="/Users/name/.gvm/pkgsets/go1.13.10/global"
GOROOT="/Users/name/.gvm/gos/go1.13.10"
GOTOOLDIR="/Users/name/.gvm/gos/go1.13.10/pkg/tool/darwin_amd64"
这就代表着 ~/.gvm/ 路径下可以同时存在多个 golang 版本,通过 gvm 命令切换指定版本的golang路径即可完成版本的切换。
这跟手动下载多个golang版本,每次切换手动配置环境变量指向是一样的道理。只不过 gvm 封装了这些操作,让这件事变得很轻松的实现。
Go mod
go mod 作用详解
类似于Android Gradle,每个项目单独配置依赖 modules
Go1.12 版本以前的 go module 依赖是直接全局下载到 GoPath 路径下,当不同的项目使用不同版本的依赖库时,就会变得非常麻烦,因为 GoPath 下只保存了一个版本的依赖库。在以往这需要手动拷贝一份相关依赖库,到其他路径给不同的项目用。
go mod 起到的作用是,它可以管理一个依赖库的多个版本同时存在。
go mod 库版本管理的原理
go mod 维护了两个主要文件 go.sum 和 go.mod
go.mod 维护了项目的golang版本以及golang依赖的库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16cat go.mod
module /go/mod-demo
go 1.12
require (
github.com/PuerkitoBio/goquery v1.5.0 // indirect
github.com/antchfx/htmlquery v1.0.0 // indirect
github.com/antchfx/xmlquery v1.0.0 // indirect
github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gocolly/colly v1.2.0
github.com/kennygrant/sanitize v1.2.4 // indirect
github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca // indirect
github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea // indirect
golang.org/x/net v0.0.0–20190522155817-f3200d17e092 // indirect
google.golang.org/appengine v1.6.0 // indirect
)go.sum 维护了项目依赖库的版本管理信息,类似 svn/git 的一个库版本记录,可以切换同一个库的不同版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33cat go.sum
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/antchfx/htmlquery v1.0.0 h1:O5IXz8fZF3B3MW+B33MZWbTHBlYmcfw0BAxgErHuaMA=
github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
github.com/antchfx/xmlquery v1.0.0 h1:YuEPqexGG2opZKNc9JU3Zw6zFXwC47wNcy6/F8oKsrM=
github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67 h1:uj4UuiIs53RhHSySIupR1TEIouckjSfnljF3QbN1yh0=
github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea h1:hH8P1IiDpzRU6ZDbDh/RDnVuezi2oOXJpApa06M0zyI=
github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea/go.mod h1:aOux3gHPCftJ3KHq6Pz/AlDjYJ7Y+yKfm1gU/3B0u04=
golang.org/x/crypto v0.0.0–20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0–20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0–20180724234803–3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0–20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0–20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
golang.org/x/net v0.0.0–20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/sys v0.0.0–20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw=
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=这样当使用同一个库的不同版本时,可以根据 go.sum 记录的版本信息,为不同项目依赖切换对应的库版本。