日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

查看go 安装了哪些包_如何灵活地进行 Go 版本管理

發(fā)布時(shí)間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查看go 安装了哪些包_如何灵活地进行 Go 版本管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文談下我對(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/.gvm
which: 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 list

gvm 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 listall

gvm 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。