Golang dependencies management – godep

在使用Go一陣子以後,最不習慣的應該就是他的套件相依管理了吧!
然而在Go的官方文件中 How to Write Go Code,不僅有詳盡介紹整個Go Project的目錄結構、相關工具等等。其中更包括了Go獨有的指令 go get

獨有的 go get 讓開發者只使用一個簡單的指令就能夠自動從公開的 repository 下載相關的套件,但是如此方便的好工具也帶來了一些不一樣的困擾。

由於 go get 每次在抓取套件的時候,都是從master抓取HEAD作為使用版本(以git為例),如此的方式造成了在跑CI的時候,會碰到相依套件API change或是相關套件已經被作者移除等問題。在Golang官方還沒有提出一個方案的時候,相關Package Management的套件如雨後春筍的冒了出來。今天在這裡先介紹其中一個較多人使用的套件 godep

godep 透過簡單的指令(save/store),能夠自動建立目前專案的相依性(Godeps/Godeps.json),並且鎖定目前套件所使用的版本(commit),自動將對應套件的source code複製一份到godep所使用的workspace中。接下來我們會介紹一些godep基本的使用和使用情境。

這邊我們從建立一個最簡單的專案來做示範。

安裝godep

基本上godep的安裝也非常的簡單,直接用go get就能取得囉!

$ go get github.com/tools/godep

godep save – 產生專案相依文件(Godeps.json)

建立測試專案

這邊我們拿 go-json-rest 做為我們練習的專案。

$ mkdir /tmp/zz
$ export GOPATH="/tmp/zz"
$ cd /tmp/zz
$ mkdir -p src/zz.com/rezt

安裝 go-json-rest

$ go get github.com/ant0ine/go-json-rest/rest

補完 sample code

# go-json-rest 的 Hello world code (https://github.com/ant0ine/go-json-rest#hello-world)
$ vim src/zz.com/rezt/test.go

編譯 sample code

$ go install zz.com/rezt

PS.編譯成功以後,會在 bin/ 下產生 rezt 這個可執行檔

進入正提:godep save

$ cd src/zz.com/rezt/
$ godep save

此時,會出現以下的錯誤:

godep: directory "/tmp/zz/src" is not using a known version control system
godep: error loading packages

一開始在這個地方卡了很久,因為從訊息中提到 “/tmp/zz/src" 沒有使用版本控制系統。難道$GOPATH/src也需要在版本控制之下嗎?
經過多次測試還有仔細思考,依照Go Project的邏輯,每一個專案都應該有獨立的版本管理,所以,解法很簡單,就是幫我們將 rezt 專案加入 git:

$ git init
$ git add .
$ git commit -m 'Yay test godep'

再執行一次

$ godep save

這次終於成功!讓我們來看一下會多出一個資料夾’Godeps’

$ ls -lh
  - Godeps/
    - Godeps.json
    - Readme
    - _workspace
  - test.go

如果有興趣的話可以自己研究一下 ‘Godeps/Godeps.json’ 和 ‘Godeps/_workspace’ 裡面相關的內容。

將 Godeps/ 目錄納入版本控制系統

git add Godeps/
git commit -m 'Add Godep generated files'

大功告成!其他相關的恢復(restore)以及進階的相依更新操作,可以先參考官方文件來使用。
希望這個文件能對有需要的朋友們產生幫助!

廣告

對「Golang dependencies management – godep」的一則回應

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s