一句話簡介
GVM(Go Version Manager)
下載多版本golang到本地緩存太惠,通過切換環(huán)境變量指向不同的Golang版本
Go mod
對 go modules 的依賴管理瘤袖,使得不同項目中依賴不同版本的同一個庫更簡單。
進一步介紹
GVM配置環(huán)境變量的原理
-
gvm
配置路徑$ cat /Users/name/.gvm/scripts/gvm export GVM_ROOT=/Users/name/.gvm . $GVM_ROOT/scripts/gvm-default
-
gvm
配置后的 golang 環(huán)境變量$go 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 關(guān)鍵環(huán)境變量都帶上了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版本,每次切換手動配置環(huán)境變量指向是一樣的道理吠勘。只不過 gvm 封裝了這些操作,讓這件事變得很輕松的實現(xiàn)峡眶。
-
Go mod
go mod 作用詳解
類似于Android Gradle看幼,每個項目單獨配置依賴 modules
Go1.12 版本以前的 go module 依賴是直接全局下載到 GoPath 路徑下,當不同的項目使用不同版本的依賴庫時幌陕,就會變得非常麻煩诵姜,因為 GoPath 下只保存了一個版本的依賴庫。在以往這需要手動拷貝一份相關(guān)依賴庫搏熄,到其他路徑給不同的項目用棚唆。
go mod 起到的作用是,它可以管理一個依賴庫的多個版本同時存在心例。
go mod 庫版本管理的原理
go mod 維護了兩個主要文件 go.sum 和 go.mod
-
go.mod 維護了項目的golang版本以及golang依賴的庫
$ cat 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 的一個庫版本記錄,可以切換同一個庫的不同版本
cat 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=
這樣當使用同一個庫的不同版本時止后,可以根據(jù) go.sum 記錄的版本信息瞎惫,為不同項目依賴切換對應(yīng)的庫版本。