聲明:本文僅限于簡書發(fā)布,其他第三方網(wǎng)站均為盜版,原文地址: golang 中的包管理
對于習慣了 Java 和 Python 的程序員來說,對于包的管理都有著比較大的期望,當然,雖然 Java 和 Python 的包管理也是存在著一些問題,但是相比起 golang 來說,那也是好得多了。
在嘗試 golang 一段時間之后,我發(fā)現(xiàn) golang 的一個比較大的問題就是包管理不容易,例如我引用了一個 package:github.com/prometheus/prometheus,然后在 build 的時候先 go get -d 一遍,這里雖然 golang 可以很智能得幫我下載需要的 package,但是,下載的版本卻默認是最新的。當然,這也不能怪 go get 這個命令,畢竟你也沒告訴它是什么版本,所以給你個最新的也不奇怪,但是,如果我就是不要最新的怎么辦?好像目前 go get 還沒有這個功能(或者不能簡單使用?)
golang 默認包管理
我最開始的做法是先用 go get -d 把需要的包 download 下來,然后再切換到 $GOPATH,之后再 checkout 我需要的版本,這個過程很是繁瑣和無趣,非常讓人沮喪。不過,好在在我搜索了一會之后,我發(fā)現(xiàn) golang 也沒有想象中的那么糟糕,在 Golang 1.5(現(xiàn)在都 1.9 了) 之后,它已經(jīng)意識到這個問題了,并且給除了一個解決方案,那就是 vendor。
從 golang 1.6 之后,golang 會默認設置環(huán)境變量 GO15VENDOREXPERIMENT 為 1,然后當你使用 go get 時,他會在你的當前包的目錄下建立一個 vendor 目錄,然后將對應的 package 都 download 到這個目錄下,但是,還是需要你在這個目錄里面切換到你需要的版本,好處就是你切換過一次,以后就不用切換了。這樣的話,當你在代碼中引用一個 package 時,golang 的查找順序是:
- 當前包下的 vendor 目錄。
- 向上級目錄查找,直到找到 src 下的 vendor 目錄。
- 在 GOPATH 下面查找依賴包。
- 在 GOROOT 目錄下查找
glide
好像使用 vendor 并沒有太多得幫助到我們,一個顯而易見的好處就是團隊協(xié)作方面是不需要擔心版本不一致了;然而,問題也很明顯,我們平時開發(fā)中,每每新建一個項目就需要這么搞一遍也是挺糟心的。程序員總是懶得,所以,有人受不了這些繁瑣事了,決定自己搞點大事情,所以就有了很多社區(qū)的 package manager tool,我認為目前比較有氣候的是 godep 和 glide。在淺嘗了兩個之后,我覺得 glide 更符合我對于 package manager tool 的期待,但是,并沒有完全吻合,只是說夠用了。
glide 的安裝很簡單,直接 brew install glide 就可以的,其他 OS 應該也差不遠。裝完之后,那么直接使用 glide init 或者 glide create 即可,然后你就會發(fā)現(xiàn)你的目錄下會有一個新的 glide.yaml 的 YAML 文件,里面描述了 package 的信息,但是只是依賴信息,并沒有版本信息。
此后,你需要使用 glide up 命令,它會建立 glide.lock 文件,里面會記錄 package 的版本信息。例如我隨便創(chuàng)建了一個,差不多就是這個樣子:

如果你需要指定版本信息,除了編輯 glide.lock 這個粗暴的方法之外,官方建議使用一個更加友善的方式就是使用這條命令:
$ glide get "github.com/gin-gonic/gin#v1.2"
我嘗試了一下,之前因為 zsh 的設置問題導致使用失敗,不過修改了一下之后,發(fā)現(xiàn)運行得還不錯,和普通的 get 的區(qū)別就是后面加上了一個 # 符號,然后后面接上 版本號,如果你喜歡,加上分支名,commit id,tag 等都是可以的。