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

一句話簡介

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)的庫版本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末译株,一起剝皮案震驚了整個濱河市瓜喇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歉糜,老刑警劉巖乘寒,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匪补,居然都是意外死亡伞辛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門夯缺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚤氏,“玉大人,你說我怎么就攤上這事踊兜「捅酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姐呐。 經(jīng)常有香客問我,道長典蝌,這世上最難降的妖魔是什么曙砂? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮骏掀,結(jié)果婚禮上鸠澈,老公的妹妹穿的比我還像新娘。我一直安慰自己截驮,他們只是感情好笑陈,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葵袭,像睡著了一般涵妥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坡锡,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天蓬网,我揣著相機與錄音,去河邊找鬼鹉勒。 笑死帆锋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的禽额。 我是一名探鬼主播锯厢,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脯倒!你這毒婦竟也來了实辑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藻丢,失蹤者是張志新(化名)和其女友劉穎徙菠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郁岩,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡婿奔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了问慎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍摊。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖如叼,靈堂內(nèi)的尸體忽然破棺而出冰木,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布踊沸,位于F島的核電站歇终,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逼龟。R本人自食惡果不足惜评凝,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腺律。 院中可真熱鬧奕短,春花似錦、人聲如沸匀钧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽之斯。三九已至日杈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑刷,已是汗流浹背达椰。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留项乒,地道東北人啰劲。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像檀何,于是被迫代替她去往敵國和親蝇裤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Go的1.11和1.12版本包括對模塊--新的Go依賴管理系統(tǒng)的初步支持频鉴,使依賴版本信息變得明確且更易于管理栓辜。這篇...
    Java天天閱讀 2,798評論 0 1
  • 1. govendor簡介 golang工程的依賴包經(jīng)常使用go get命令來獲取,例如:go get githu...
    葉揚風起閱讀 16,622評論 0 4
  • Go Module是Go會在1.12中正式推出的包管理機制垛孔。 Go mod 簡介 Golang一直存在一個被人詬病...
    會飛的鯰魚閱讀 47,868評論 1 14
  • 什么是 module藕甩?module 解決了什么問題? module 代表一個版本管理單元周荐,它包括一個或者多個 pa...
    安佳瑋閱讀 1,747評論 0 5
  • “醫(yī)生狭莱,我好像不會笑了「抛鳎” “你可以去看南城門下的那個小丑腋妙,據(jù)說看了他的表演,沒有人會不笑的讯榕≈杷兀” “可是匙睹,我,就是...
    木子豆豆閱讀 199評論 0 0