Golang 的 package 管理

當把全部的 golang 項目放到同一個 golang workspace 都會遇到一個問題,那就是 3rd party package 版本控制的問題。例如:我有一個 golang workspace 他的入徑是 c:/go-projects/src 然後下面有兩個項目分別較 project-one 和 project-two 而這兩個項目都有用到網路上的某一個包 (假設叫 gozip), 當 project-one 要升級 gozip 套件的時候,另外一個項目 project-two 也被需要強迫被升級,因為它們的引用gozip 套件來源是同一個地方,所以有些人比較喜歡用 golang workspace per project 的方式來進行開發,讓彼此golang的專案不會受到影響。

在 Golang 1.5 的時候引入了一個 GO15VENDOREXPERIMENT 環境變數,預設是 0 (關閉), 不過這個變數在 Golang 1.6 預設是 1 (啟開), 據說在 Golang 1.7 這個變數會被移除同時籲社會是啟開的。這個環境變數只要是告訴 golang 本身應該去本地端哪裡找第三方套件來編譯。拿我們之前舉的範例來說,當GO15VENDOREXPERIMENT 環境變數被設為 0 的時候,golang 會去 c:/go-projects/src/gozip 找 gozip 的代碼來編譯,當GO15VENDOREXPERIMENT 環境變數被設為 1 的時候,Golang會去項目路徑下的 vendor 目錄找 gozip 代碼。這功能是建立在 golang 本身的工具集身上 (go build 等等),所以我們的是不需要修改代碼的,也就是說在我們項目裡面的 import 路徑還是保持像這樣

import (
	"github.com/test/gozip"
)

不過這時候我們需要一個工具去把目前項目有用到的套件代碼,建立一份到項目路徑裡面的 vendor目錄,之後執行 go build 的時候,golang會知道去 vendor目錄下找代碼(前提是要你的項目必須要在 gopath 下面,因為 golang tool 只支援這些路徑)。這邊我們可以使用 Godep 來完成這件事,在當前的項目裡執行godep save命令就可以完成了,之後就可以把項目代碼和所用到套件的代碼 commmit 到你的 git repo.