教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang版本工具GVM 和包管理工具go mod原理讲解

golang版本工具GVM 和包管理工具go mod原理讲解

发布时间:2022-01-03   编辑:jiaochengji.com
教程集为您提供golang版本工具GVM 和包管理工具go mod原理讲解等资源,欢迎您收藏本站,我们将为您提供最新的golang版本工具GVM 和包管理工具go mod原理讲解资源
<h2>一句话简介</h2> <h3>GVM(Go Version Manager)</h3> <blockquote>

下载多版本golang到本地缓存,通过切换环境变量指向不同的Golang版本

</blockquote> <h3>Go mod</h3> <blockquote>

对 go modules 的依赖管理,使得不同项目中依赖不同版本的同一个库更简单。

</blockquote> <h2>进一步介绍</h2> <h3>GVM配置环境变量的原理</h3> <ul><li>

<code>gvm</code>配置路径

<pre><code class="lang-shell hljs">$ cat /Users/name/.gvm/scripts/gvm export GVM_ROOT=/Users/name/.gvm . $GVM_ROOT/scripts/gvm-default </code></code></pre> </li> <li>

<code>gvm</code>配置后的 golang 环境变量

<pre><code class="lang-shell hljs">$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" </code></code></pre> <ul><li>

从上面的 <code>go env</code> 配置可以看到,通过 gvm 管理的 golang 关键环境变量都带上了golang的版本标识

<ul><li><code>GOPATH="/Users/name/.gvm/pkgsets/go1.13.10/global"</code></li> <li><code>GOROOT="/Users/name/.gvm/gos/go1.13.10"</code></li> <li><code>GOTOOLDIR="/Users/name/.gvm/gos/go1.13.10/pkg/tool/darwin_amd64"</code></li> </ul><blockquote>

这就代表着 ~/.gvm/ 路径下可以同时存在多个 golang 版本,通过 gvm 命令切换指定版本的golang路径即可完成版本的切换。

这跟手动下载多个golang版本,每次切换手动配置环境变量指向是一样的道理。只不过 gvm 封装了这些操作,让这件事变得很轻松的实现。

</blockquote> </li> </ul></li> </ul><h3>Go mod</h3> <h4>go mod 作用详解</h4> <ul><li>

类似于Android Gradle,每个项目单独配置依赖 modules

</li> <li>

Go1.12 版本以前的 go module 依赖是直接全局下载到 GoPath 路径下,当不同的项目使用不同版本的依赖库时,就会变得非常麻烦,因为 GoPath 下只保存了一个版本的依赖库。在以往这需要手动拷贝一份相关依赖库,到其他路径给不同的项目用。

</li> <li>

go mod 起到的作用是,它可以管理一个依赖库的多个版本同时存在。

</li> </ul><h4>go mod 库版本管理的原理</h4> <blockquote>

go mod 维护了两个主要文件 go.sum 和 go.mod

</blockquote> <ul><li>

go.mod 维护了项目的golang版本以及golang依赖的库

<pre><code class="lang-shell hljs">$ 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 ) </code></code></pre> </li> <li>

go.sum 维护了项目依赖库的版本管理信息,类似 svn/git 的一个库版本记录,可以切换同一个库的不同版本

<pre><code class="lang-shell hljs">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= </code></code></pre>

这样当使用同一个库的不同版本时,可以根据 go.sum 记录的版本信息,为不同项目依赖切换对应的库版本。

</li> </ul>
到此这篇关于“golang版本工具GVM 和包管理工具go mod原理讲解”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang版本工具GVM 和包管理工具go mod原理讲解
Go 1.5之前的多种包管理机制简介(
Go Module入门及Golang项目组织
golang Modules 依赖管理工具使用
Golang包管理详解
一.go安装
Golang包管理工具govendor的使用
想系统学习GO语言(Golang
GO 依赖管理工具go Modules(官方推荐)
gin-vue-admin 使用 go mod , golang开发工具 提示package gin-vue-admin/core is not in GOROOT

[关闭]
~ ~