golang 中的包管理

聲明:本文僅限于簡書發(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)境變量 GO15VENDOREXPERIMENT1,然后當你使用 go get 時,他會在你的當前包的目錄下建立一個 vendor 目錄,然后將對應的 package 都 download 到這個目錄下,但是,還是需要你在這個目錄里面切換到你需要的版本,好處就是你切換過一次,以后就不用切換了。這樣的話,當你在代碼中引用一個 package 時,golang 的查找順序是:

  • 當前包下的 vendor 目錄。
  • 向上級目錄查找,直到找到 src 下的 vendor 目錄。
  • 在 GOPATH 下面查找依賴包。
  • 在 GOROOT 目錄下查找

glide

好像使用 vendor 并沒有太多得幫助到我們,一個顯而易見的好處就是團隊協(xié)作方面是不需要擔心版本不一致了;然而,問題也很明顯,我們平時開發(fā)中,每每新建一個項目就需要這么搞一遍也是挺糟心的。程序員總是懶得,所以,有人受不了這些繁瑣事了,決定自己搞點大事情,所以就有了很多社區(qū)的 package manager tool,我認為目前比較有氣候的是 godepglide。在淺嘗了兩個之后,我覺得 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 等都是可以的。

Reference

  1. golang vendor
  2. golang/go PackageManagementTools
  3. Glide: Vendor Package Management for Golang
  4. golang使用vendor目錄來管理依賴包
  5. compare glide and godep
  6. 采用Glide對Golang進行包管理
  7. Golang 套件管理工具 Glide
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 包管理的重要性不言而喻。隨著項目的推進,沒有合適的包管理,每一次迭代都將成為開發(fā)者的噩夢。尤其是對于進行持續(xù)集成的...
    suoga閱讀 4,578評論 4 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評論 25 708
  • 一、概述 golang的包管理工具有很多,本篇幅主要介紹glide進行包管理。 二、安裝及命令介紹 go get ...
    碼農(nóng)不器閱讀 1,040評論 0 0
  • 原文地址:http://www.gaoxuan1989.com/2017/07/10/golang-vendor-...
    tcgx閱讀 62,466評論 5 12
  • 我相信生死輪回,所以我不害怕死亡,我相信永恒,因為在輪回的世界里生命會度度重生! 我相信愛,因為只有愛,可以治愈一...
    Lynn尚閱讀 840評論 0 51

友情鏈接更多精彩內(nèi)容