用 govendor 管理 Golang 第三方套件

不知道平常你都是如何管理 Golang 專案裡所使用的套件呢?是使用 go get 嗎?那有沒有發現當發佈了程式後,忽然某個套件的作者更新了!這時有人 clone 你的專案來使用,結果一執行 go get 你程式就炸了… 所以,有一個好的套件管理員是非常重要的啊啊啊!今天就來介紹一下 Golang 的套件管理員 govendor!

Hello govender!

govender 簡單說就是 Node.js 的 npm,協助開發者管理自己 專案裡 所用的外部套件。但…… Golang 自己都沒發現這個問題嗎?其實有。所以在 這👈 可以發現 Golang 其實有提供一個 dep tool 的工具,不過這個工具目前還在 pre-alpha 階段,還是建議先使用第三方的管理工具作管理。

如果你使用 Golang v1.5

小心!因為 Golang v1.5 並沒有預設啟動 vendor 的功能,如果想要使用 govendor 的話,必須將 GO15VENDOREXPERIMENT=1 加入你的 Golang env 才能正常使用。

其他的版本呢?

而使用 v1.5 版本後的你就不需擔心啦!在 v1.6 還是有 GO15VENDOREXPERIMENT 的 flag,但預設是啟用的。v1.6 之後的版本 (目前是 v1.9) 都已經預設啟用,而且 GO15VENDOREXPERIMENT 的 flag 也被拿掉了。

竟然都預設支援 vendor 了,為什麼還需要工具呢?

確實,在開發的時候你可以自行建立 vendor 資料夾,然後在把第三方的套件下載進來,而用 govendor 的理由是什麼呢?其實 govendor 最方便的地方就是他會有 vendor.json,簡單說就是 npm 的 packet.json。他會協助將下載下來的包記錄下來,並一併紀錄目前所使用版本(commitID)。也就是說你只需要將 vendor.json 上傳,其他人只要有這個檔案,執行 govendor sync 就可以把你所使用的第三方套件抓下來,而且是開發時所使用的版本。

但如果第三方套件被刪掉就沒辦法這麼做了… 的確要好好考慮一下要選哪種方式來同步套件。

還有一個特色是 govendor 會協助將第三方套件瘦身,如果今天是手動用 git clone 的方式下載下來,會發現套件裡也會有他本身的 git, 測試, 開發設定檔… 等其他檔案。不過使用 govendor 就只會下載原始碼,而且當第三方套件也有用 vendor 的話,也會一併將依賴下載下來並記錄到 vendor.json

GOGOGO 開始安裝!

安裝 govendor 非常簡單,只需要執行下面的指令就可以完成安裝。(需先安裝 Golang)

1
> go get -u github.com/kardianos/govendor

指令介紹

接下來介紹一下常見的指令,基本上會這幾個指令就可以打十個了!當然還是可以到 govendor 官方的 文件 了解更詳細的使用方式。

govendor init

govendor init 這個指令會協助你的專案建立 vendor/ 資料夾,並建立 vendor.json。(一開始都必須執行這個指令)

govendor add +external

如果你的專案已經開發一段時間,而且之前都是使用 go get 的方式下載第三方套件,你就必須使用 govendor add +external,將專案裡有使用到的套件(而且 $GOPATH/src 裡已經下載了),複製到自己的 vendor/ 資料夾。(如果是新的專案就不需執行)

govendor fetch [url]

當開發專案中需要安裝(或更新)某一些第三方套件時,可以直接執行 govendor fetch,這時 govendor 就會幫你將包下載到 vendor/

govendor fetch [url]@[tag]

這個就比較特殊一點的用法,tag 可以直接輸入你想下載第三方套件的某一個 git commitID,又或是 git tag。下面有一些官方提供的案例:

1
2
3
govendor fetch golang.org/x/net/context@a4bbce
govendor fetch golang.org/x/net/context@v1 # Get latest v1.*.* tag or branch.
govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named "v1".

govendor sync

當你在專案裡有使用 git 的時候,你可能不希望 vendor/ 裡的程式碼一併被包進去。這時你就必須在 .gitignore 裡加上 vendor/*/,那麼在 commit 時,第三方套件就不會被加進去了(vendor/vendor.json 還是會哦!)。當 git clone 專案時,只需執行 govendor sync 就可以把第三方套件(指定版本)都下載下來了!

總結

當然,網路上有非常多第三方套件的管理工具,不過基於我在 golangtw@Telegram 調查之後,絕大多數的開發者還是推薦 govendor,就連 DigitalOcean 也 推薦 啊!

快使用 govendor 來管理你的第三方套件吧!🚀