查看go 安装了哪些包_如何灵活地进行 Go 版本管理
本文談下我對(duì) Go 版本管理的一些思考,并給大家介紹一個(gè)小工具,gvm。這個(gè)話(huà)題說(shuō)起來(lái)也很簡(jiǎn)單,但如果想用的爽,還是要稍微梳理下。
背景介紹
Go 的版本管理,并非包的依賴(lài)管理。平時(shí)的工作中,很多時(shí)候并不會(huì)遇到這樣的需求,所以可能并不是很明白它的價(jià)值。
簡(jiǎn)單說(shuō)下我寫(xiě)這篇文章的背景吧。
最近幾周,Go 最重要的一則消息應(yīng)該莫過(guò) 9月份 Go 1.13 的正式發(fā)布。它的相關(guān)升級(jí)可查看 Go 1.13 正式發(fā)布,看看都有哪些值得關(guān)注的特性[1] 或官方 Go 1.13 Relase Notes[2]。
對(duì)于一名 gopher 而言,可能早已按捺不住自己那顆躁動(dòng)的心,想盡快體驗(yàn)下新版的升級(jí)項(xiàng)。但問(wèn)題是,切換至新版 Go 通常會(huì)遇到一些問(wèn)題,比如不同版本的環(huán)境配置,安裝的輔助工具和程序包在不同版本下可能會(huì)存在兼容或被覆蓋等問(wèn)題。
我自然就希望有一套方案可以幫助我完成 Go 版本的切換,實(shí)現(xiàn)不同版本間環(huán)境的完全隔離。
思考方案
談到環(huán)境隔離,有很多方案可供選擇,如多主機(jī)、虛擬機(jī)、容器等技術(shù)。這些聽(tīng)起來(lái)都挺不錯(cuò),都能實(shí)現(xiàn)需求。但如果只是為了 Go 版本管理,完全可以自己實(shí)現(xiàn)。
多版本切換,主要是不同版本環(huán)境變量的隔離。Go 1.10 之前,我們關(guān)心的變量有 GOROOT、GOPATH 和 PATH。Go 1.10 之后,GOROOT 已經(jīng)默認(rèn)為 go 的當(dāng)前安裝路徑,只要考慮 GOPATH 和 PATH 即可。
最近,剛答過(guò)一個(gè)關(guān)于 Go 環(huán)境變量的問(wèn)題,查看回答[3]。其中對(duì)每個(gè)變量的作用進(jìn)行了比較細(xì)致的描述。
如何實(shí)現(xiàn)
現(xiàn)在,我要實(shí)現(xiàn)我自己電腦上的兩個(gè)版本的 Go 自由切換,該如何做呢?
假設(shè)它們分別位于 ~/.goversions/sdk/ 目錄下的 go1.11/ 和 go1.13/。我現(xiàn)在要啟用 go 1.11,運(yùn)行如下命令即可:
$ export PATH=~/.goversions/sdk/go1.11/bin/:$PATH此時(shí),GOROOT 已經(jīng)自動(dòng)識(shí)別,為 ~/.goversions/sdk/go1.11/。Go 相關(guān)的工具鏈,源碼,標(biāo)準(zhǔn)庫(kù)都在這個(gè)目錄下。
但除 Go 自帶外,還有其他第三方標(biāo)準(zhǔn)庫(kù)、編譯生成的庫(kù)文件等內(nèi)容,它們都位于 GOPATH 下,如果不設(shè)置,默認(rèn)為 ~/go,在切換多版本的時(shí)候,就會(huì)產(chǎn)生混亂。我們可以為每個(gè)版本單獨(dú)設(shè)置個(gè) GOPATH。
如 go1.11,設(shè)置 GOPATH 為 ~/.goversions/gopath/go1.11-global/。
$ mkdir ~/.goversions/gopath/go1.11-global/$ export GOPATH=~/.goversions/gopath/go1.11-global/
一個(gè)獨(dú)立的環(huán)境創(chuàng)建好了。
如果現(xiàn)在要切換至 go 1.13,幾個(gè)命令即可搞定。
$ export PATH=~/.goversions/sdk/go1.13/bin/:$PATH$ mkdir -pv ~/.goversions/gopath/go1.13-global/
$ export GOPATH=~/.goversions/gopath/go1.13-global/
切換成功。
雖然,已經(jīng)實(shí)現(xiàn)了需求,但總覺(jué)得用起來(lái)非常不爽。為了操作方便,其實(shí)可以把上面的思路提煉成 shell 腳本,整理成一套工具。
是不是蠢蠢欲動(dòng),想試一下?
但很遺憾,已經(jīng)沒(méi)這個(gè)機(jī)會(huì)了,因?yàn)檫@個(gè)工具已經(jīng)有人開(kāi)發(fā)了,思路類(lèi)似,但卻比這里描述的要強(qiáng),它就是 gvm, 地址 moovweb/gvm[4]。
什么是 ?gvm
gvm,即 Go Version Manager,Go 版本管理器,它可以非常輕量的切換 Go 版本。對(duì)比其他語(yǔ)言,通常也有類(lèi)似的工具,如 NodeJS 的 NVM,Python 的 virtualenv 等。
gvm 不僅包含上面提到的版本切換,還可以直接通過(guò)源碼編輯安裝任意版本的 Go,當(dāng)然最好是 1.5 及之后版本,原因后面解釋。
一件比較尷尬的點(diǎn),gvm 產(chǎn)生背景并非是為了 Go 在不同版本間的切換,開(kāi)發(fā)團(tuán)隊(duì)當(dāng)初開(kāi)發(fā)這個(gè)工具主要為了解決項(xiàng)目的依賴(lài)問(wèn)題,通過(guò)切換環(huán)境實(shí)現(xiàn)包依賴(lài)的切換。下面,我會(huì)演示如何做到這一點(diǎn)。
但問(wèn)題是,現(xiàn)在 Go 的依賴(lài)管理已經(jīng)日趨完善,官方的 go module 也越來(lái)越好用,GOPATH 在被逐漸弱化,gvm 似乎也就只剩下幫我們快速體驗(yàn)不同 Go 版本的功能還有點(diǎn)價(jià)值。
廢話(huà)說(shuō)了那么多,開(kāi)始正式體驗(yàn)下這個(gè)工具吧。
如何安裝
安裝很簡(jiǎn)單,只要如下一行命令即可搞定。
$ bash <輸出顯示:
Cloning from https://github.com/moovweb/gvm.git to /home/vagrant/.gvmwhich: no go in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin)
No existing Go versions detected
Installed gvm v1.0.22
Please restart your terminal session or to get started right away run
`source /home/vagrant/.gvm/scripts/gvm`
安裝完成!
重啟控制臺(tái)或執(zhí)行 source $HOME/.gvm/scripts/gvm 即可啟用 gvm。
提醒下,不同操作系統(tǒng)還需要相應(yīng)的依賴(lài)項(xiàng)要裝,具體查看 項(xiàng)目說(shuō)明[5] 的介紹。這里面沒(méi)有提到 Windows,不知道可不可用。
gvm 安裝 Go
gvm 通過(guò)從 github 下載源碼編譯 Go 的安裝。而版本則是基于源碼中的 tag。因?yàn)?1.5 版本及之后,Go 已經(jīng)實(shí)現(xiàn)了自編譯,因而要使用 gvm 安裝 Go,我們要提前有可用的 Go 環(huán)境。
Go 的安裝可以閱讀我之前的一篇文章 詳細(xì)聊聊如何安裝 Go,我認(rèn)為介紹的還算詳細(xì)。
Go 安裝完成,就可以使用 gvm 隨意安裝切換任意版本的 Go 了。
$ gvm install go1.11等待運(yùn)行完成即可。
首次安裝的時(shí)間可能會(huì)比較久,主要取決于你的網(wǎng)絡(luò),因?yàn)榈谝淮涡枰獜?github 下載源碼。
查看版本
首先,查看下我的系統(tǒng)已經(jīng)安裝哪些 Go 版本有哪些吧,相關(guān)命令 gvm list。
$ gvm listgvm gos (installed)
go1.11
go1.12
go1.13
go1.13beta1
安裝了 4 個(gè)版本,其中,go1.13beta1 是非穩(wěn)定版本,所以說(shuō),如果我們想盡快嘗試 go 的新特性,gvm 還是很便捷的。
除了查看已安裝的版本,還可以通過(guò) gvm listall 查看所有版本,版本來(lái)源于源碼中的 tag 標(biāo)簽。
$ gvm listallgvm gos (available)
go1
go1.0.1
go1.0.2
go1.0.3
go1.1
...
go1.13
go1.13beta1
go1.13rc1
go1.13rc2
但這個(gè)操作在 mac 上無(wú)法執(zhí)行,gvm 的實(shí)現(xiàn)中用到了 Linux 的 sort 命令,它與 mac 上的 sort 不兼容。
怎么解決?
安裝個(gè)軟件 coreutils, 它之中有個(gè) qsort 命令可用。通過(guò) brew install coreutils 可直接安裝。然后,修改下文件 $HOME/.gvm/scripts/function/tool,將其中的 sort 修改為 qsort 即可。
選擇版本
選擇啟用的版本就非常簡(jiǎn)單了。如下:
$ gvm use go1.11 [--default]啟用成功后,可以通過(guò) go version 和 go env 確認(rèn)下。如果想默認(rèn)一個(gè)版本,加上 --default 設(shè)置即可。
包環(huán)境管理
gvm 除了 Go 版本的管理,還可以管理包環(huán)境,相關(guān)命令是 pkgenv 和 pkgset。如果沒(méi)使用包依賴(lài)管理工具,它也是挺方便的。
演示個(gè)例子,假設(shè)我們要?jiǎng)?chuàng)建一個(gè)新的項(xiàng)目 blog,可提前創(chuàng)建相應(yīng)的環(huán)境。
$ gvm pkgset create blog # 創(chuàng)建$ gvm pkgset use blog # 啟用
現(xiàn)在,我們通過(guò) go get 安裝的包都會(huì)默認(rèn)在 blog 環(huán)境下。基于的原理是 go get 默認(rèn)會(huì)把安裝的放在 GOPATH 中的第一個(gè)目錄下。
好了,就介紹這么多吧。有興趣的朋友可以再研究研究。畢竟在有了 go mod 之后,這個(gè)功能以后是基本不會(huì)用了。
gvm 目錄結(jié)構(gòu)
gvm 是 shell 編寫(xiě),默認(rèn)是安裝在 $HOME/.gvm/ 目錄下。查看下它的目錄結(jié)構(gòu)會(huì)有助我們了解它的實(shí)現(xiàn)。
其中幾個(gè)主要的目錄,如下:
archive # go 源碼bin # gvm 可執(zhí)行文件
environments # 不同環(huán)境的環(huán)境變量配置
scripts # gvm 的子命令腳本
logs # 日志信息
pkgsets # 每個(gè)獨(dú)立環(huán)境 gopath 所在路徑
在研究了 gvm 的實(shí)現(xiàn)后,我們會(huì)發(fā)現(xiàn),這一套思路其實(shí)也適用于其他很多工具的版本管理。如果之后再遇到同樣的需求,即使我們沒(méi)有現(xiàn)成的工具,自己實(shí)現(xiàn)一套也是可以的。
總結(jié)
本文從我的需求出發(fā),引出了如何靈活地進(jìn)行管理 Go 版本的話(huà)題。
以往的經(jīng)驗(yàn)告訴我,既然其他語(yǔ)言都有工具實(shí)現(xiàn)這樣的需求,Go 也應(yīng)該有。搜索了下,找到了 gvm。雖說(shuō)我在使用它的時(shí)候,發(fā)現(xiàn)了一些 bug 與體驗(yàn)不好的地方,但總體而言,已經(jīng)足夠滿(mǎn)足我的需求。
周五了,大家周末愉快!
參考
Go 語(yǔ)言多版本安裝及管理利器 - gvm[6]moovweb/gvm[7]gvm + go mod[8]
參考資料
[1]Go 1.13 正式發(fā)布,看看都有哪些值得關(guān)注的特性: https://studygolang.com/topics/10021
[2]Go 1.13 Relase Notes: http://docs.studygolang.com/doc/go1.13
[3]查看回答: https://www.zhihu.com/question/346680587/answer/828786340
[4]moovweb/gvm: https://github.com/moovweb/gvm
[5]項(xiàng)目說(shuō)明: https://github.com/moovweb/gvm#mac-os-x-requirements
[6]Go 語(yǔ)言多版本安裝及管理利器 - gvm: https://dryyun.com/2018/11/28/how-to-use-gvm/
[7]moovweb/gvm: https://github.com/moovweb/gvm
[8]gvm + go mod: https://medium.com/golang-%E7%AD%86%E8%A8%98/gvm-go-mod-492a54c15c41
總結(jié)
以上是生活随笔為你收集整理的查看go 安装了哪些包_如何灵活地进行 Go 版本管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中高阶函数改写学生信息管理程
- 下一篇: vbs 等于_西门子触摸屏VBS编程qu