3.2 Go語(yǔ)言從入門(mén)到精通:包管理工具之GOPATH

作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。 










當(dāng)我們真正用 Go 去做項(xiàng)目,或者閱讀 Go 項(xiàng)目(如,Go 實(shí)現(xiàn)的開(kāi)源項(xiàng)目)時(shí),不可避免的會(huì)遇到包依賴問(wèn)題,一些包管理方式總是很難區(qū)分、選擇。Go的包管理與Java的Maven依賴管理不太一樣,起初Go的包管理方式經(jīng)常會(huì)被人吐槽,但隨之Go版本的升級(jí)也出現(xiàn)了不同的包管理方式,以滿足不同的需求。

今天,我們就 GOPATH 開(kāi)始來(lái)了解 Go 最基本的包管理方式,讓你徹底認(rèn)清它。(雖然很簡(jiǎn)單,但作為系列文章還是有必然單獨(dú)說(shuō)一下的)
1、GOPATH

GOPATH, 被稱之為“工作目錄”,是 Go 語(yǔ)言中使用的一個(gè)環(huán)境變量,它使用絕對(duì)路徑提供Go項(xiàng)目的絕對(duì)路徑,類似于 eclipse 中的工作空間 workspace。

工作目錄是一個(gè)工程開(kāi)發(fā)的相對(duì)參考目錄,好比當(dāng)你要在公司編寫(xiě)一套服務(wù)器代碼,你的工位所包含的桌面、計(jì)算機(jī)及椅子就是你的工作區(qū)。工作區(qū)的概念與工作目錄的概念也是類似的。如果不使用工作目錄的概念,在多人開(kāi)發(fā)時(shí),每個(gè)人有一套自己的目錄結(jié)構(gòu),讀取配置文件的位置不統(tǒng)一,輸出的二進(jìn)制運(yùn)行文件也不統(tǒng)一,這樣會(huì)導(dǎo)致開(kāi)發(fā)的標(biāo)準(zhǔn)不統(tǒng)一,影響開(kāi)發(fā)效率。

GOPATH 適合處理大量 Go語(yǔ)言源碼、多個(gè)包組合而成的復(fù)雜工程。
1.1 GOPATH的基本使用

其實(shí)早在[1.2 Go語(yǔ)言從入門(mén)到精通:開(kāi)發(fā)環(huán)境搭建](./1.2 Go語(yǔ)言從入門(mén)到精通:開(kāi)發(fā)環(huán)境搭建.md)一文中已經(jīng)涉及到了 GOPATH,GOPATH的配置在安裝時(shí)已經(jīng)設(shè)置過(guò)了。

查看

因GOPATH作為一個(gè)環(huán)境變量而存在,可直接輸入命令 go env來(lái)查看:

C:\Users\Administrator>go env
…省略其它…
set GOPATH=E:\github
…省略其它…

從命令行輸出中,可以看到 GOPATH 設(shè)定的路徑為:E:\github。(該GOPATH是我手動(dòng)修改過(guò)的)

在 Go 1.8 版本之前,GOPATH 環(huán)境變量默認(rèn)為空。從 Go 1.8 版本開(kāi)始,Go 開(kāi)發(fā)包在安裝完成后,將 GOPATH 賦予了一個(gè)默認(rèn)的目錄。

設(shè)置

選擇一個(gè)目錄,執(zhí)行命令set GOPATH=:

C:\Users\Administrator>set GOPATH=E:\github

Linux環(huán)境下,執(zhí)行命令 export GOPATH=。
1.2 GOPATH工程結(jié)構(gòu)

在GOPATH目錄下會(huì)存在三個(gè)文件夾:
在這里插入圖片描述bin、pkg 是在編譯時(shí)(如,執(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ū)別

不同于其他語(yǔ)言,Go 語(yǔ)言中沒(méi)有項(xiàng)目的說(shuō)法,只有包的概念。其中,GOROOT 和 GOPATH 很容易被大家混為一談。

GOROOT: Go 語(yǔ)言的安裝目錄。(類似于 Java 的 JDK,存放的是一些內(nèi)置包、編譯工具等)
GOPATH:我們的工作空間,即:保存 Go 的代碼和第三方依賴包。

2、小結(jié)

GOPATH 是最早的依賴包管理方式,是將所有的本地代碼和第三方包代碼均放在 GOPATH/src 目錄下,它的優(yōu)點(diǎn)是統(tǒng)一管理,方便查詢和引用。

但是在使用過(guò)程中會(huì)有一個(gè)非常嚴(yán)重的問(wèn)題,那就是由于所有不同的項(xiàng)目都放在 GOPATH/src 目錄下,當(dāng)多個(gè)不同項(xiàng)目引用的是同一個(gè)第三方包,但是該第三包的不同版本時(shí),便會(huì)導(dǎo)致嚴(yán)重的包依賴問(wèn)題。

因此,這也是 Go 語(yǔ)言之初被詬病的一個(gè)點(diǎn),那么該如何解決上述問(wèn)題呢?