3.2 Go語言從入門到精通:包管理工具之GOPATH
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
當(dāng)我們真正用 Go 去做項目,或者閱讀 Go 項目(如,Go
實現(xiàn)的開源項目)時,不可避免的會遇到包依賴問題,一些包管理方式總是很難區(qū)分、選擇。Go的包管理與Java的Maven依賴管理不太一樣,起初Go的包管理方式經(jīng)常會被人吐槽,但隨之Go版本的升級也出現(xiàn)了不同的包管理方式,以滿足不同的需求。
今天,我們就 GOPATH 開始來了解 Go 最基本的包管理方式,讓你徹底認(rèn)清它。(雖然很簡單,但作為系列文章還是有必然單獨說一下的)
1、GOPATH
GOPATH, 被稱之為“工作目錄”,是 Go 語言中使用的一個環(huán)境變量,它使用絕對路徑提供Go項目的絕對路徑,類似于 eclipse 中的工作空間 workspace。
工作目錄是一個工程開發(fā)的相對參考目錄,好比當(dāng)你要在公司編寫一套服務(wù)器代碼,你的工位所包含的桌面、計算機及椅子就是你的工作區(qū)。工作區(qū)的概念與工作目錄的概念也是類似的。如果不使用工作目錄的概念,在多人開發(fā)時,每個人有一套自己的目錄結(jié)構(gòu),讀取配置文件的位置不統(tǒng)一,輸出的二進制運行文件也不統(tǒng)一,這樣會導(dǎo)致開發(fā)的標(biāo)準(zhǔn)不統(tǒng)一,影響開發(fā)效率。
GOPATH 適合處理大量 Go語言源碼、多個包組合而成的復(fù)雜工程。
1.1 GOPATH的基本使用
其實早在[1.2 Go語言從入門到精通:開發(fā)環(huán)境搭建](./1.2 Go語言從入門到精通:開發(fā)環(huán)境搭建.md)一文中已經(jīng)涉及到了 GOPATH,GOPATH的配置在安裝時已經(jīng)設(shè)置過了。
查看
因GOPATH作為一個環(huán)境變量而存在,可直接輸入命令 go env來查看:
C:\Users\Administrator>go env
…省略其它…
set GOPATH=E:\github
…省略其它…
從命令行輸出中,可以看到 GOPATH 設(shè)定的路徑為:E:\github。(該GOPATH是我手動修改過的)
在 Go 1.8 版本之前,GOPATH 環(huán)境變量默認(rèn)為空。從 Go 1.8 版本開始,Go 開發(fā)包在安裝完成后,將 GOPATH 賦予了一個默認(rèn)的目錄。
設(shè)置
選擇一個目錄,執(zhí)行命令set GOPATH=:
C:\Users\Administrator>set GOPATH=E:\github
Linux環(huán)境下,執(zhí)行命令 export GOPATH=。
1.2 GOPATH工程結(jié)構(gòu)
在GOPATH目錄下會存在三個文件夾:
bin、pkg 是在編譯時(如,執(zhí)行g(shù)o build、go install 、go get等命令)創(chuàng)建。
例如:
bin/
hello # command executable
outyet # command executable
pkg/
……
src/
github.com/golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
1.3 GOPATH和GOROOT的區(qū)別
不同于其他語言,Go 語言中沒有項目的說法,只有包的概念。其中,GOROOT 和 GOPATH 很容易被大家混為一談。
GOROOT: Go 語言的安裝目錄。(類似于 Java 的 JDK,存放的是一些內(nèi)置包、編譯工具等)
GOPATH:我們的工作空間,即:保存 Go 的代碼和第三方依賴包。
2、小結(jié)
GOPATH 是最早的依賴包管理方式,是將所有的本地代碼和第三方包代碼均放在 GOPATH/src 目錄下,它的優(yōu)點是統(tǒng)一管理,方便查詢和引用。
但是在使用過程中會有一個非常嚴(yán)重的問題,那就是由于所有不同的項目都放在 GOPATH/src 目錄下,當(dāng)多個不同項目引用的是同一個第三方包,但是該第三包的不同版本時,便會導(dǎo)致嚴(yán)重的包依賴問題。
因此,這也是 Go 語言之初被詬病的一個點,那么該如何解決上述問題呢?