這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
godep是解決包依賴的管理工具
安裝
go get github.com/tools/godep
成功安裝後,在GOPATH的bin目錄下會有一個godep可執行檔二進位檔案,後面執行的命令都是用這個,間隔這個目錄加入到PATH目錄中。
編譯和運行
項目用godep管理後,要編譯和運行項目的時候再用go run和go build顯然就不行了,因為go命令是直接到GOPATH目錄下去找第三方庫。而使用godep下載的依賴庫放到Godeps/workspace目錄下的;
godep go build XXX
godep中的go命令,就是將原先的go命令加了一層殼,執行godep go的時候,會將當前項目的workspace目錄加入GOPATH變數中;
godep save
godep save將項目中使用到的第三方庫複製到項目的Godeps目錄下。
godep save 會自動掃描目前的目錄所屬包中import的所有外部依賴庫(非系統庫),並查看其是否屬於某個代碼管理工具(比如git,hg)。若是,則把此庫擷取路徑和當前對應的revision(commit id)記錄到目前的目錄Godeps下的Godeps.json,同時,把不含代碼管理資訊(如.git目錄)的代碼拷貝到Godeps/_workspace/src下,用於後繼godep go build等命令執行時固定尋找依賴包的路徑。
因此,godep save能否成功執行需要有兩個要素:當前或者需掃描的包均能夠編譯成功:因此所有依賴包事先都應該已經或go get或手工操作儲存到當前GOPATH路徑下依賴包必須使用了某個代碼管理工具(如git,hg):這是因為godep需要記錄revision
godep restore
如果下載的項目中只有Godeps.json檔案,而沒有包含第三庫則可以使用godep restore這個命令將所有的依賴庫下來下來到GOPATH的src中。
godep restore
godep restore執行時,godep會按照Godeps/Godeps.json內列表,依次執行go get -d -v 來下載對應依賴包到GOPATH路徑下,因此,如果某個原先的依賴包儲存路徑(GOPATH下的相對路徑)與下載url路徑不一致,比如kuberbetes在github上路徑是github.com/kubernetes,而代碼內import則是k8s.io,則會導致無法下載成功,也就是說godep restore不成功。這種只能手動,比如手動建立$GOPATH/k8s.io目錄,然後git clone。
golang內建包管理工具
內建工具:go getgo get可以將依賴的第三方庫下載本GOPATH目錄,在代碼中直接import相應的程式碼程式庫就可以了。與godep相比,如果項目引用的第三方庫沒有列入到項目裡面,安裝項目時,針對第三方庫需要使用go get一個個下載,比較麻煩;
註:使用godep restore可能導致部分庫無法下載下來;編譯會報錯:cmd/decode.go:16:2: cannot find package "github.com/CodisLabs/redis-port/pkg/libs/atomic2" in any of:
此時針對報錯的特定庫再go get一般都能下載:go get github.com/CodisLabs/redis-port/pkg/libs/atomic2
godep支援的命令
save list and copy dependencies into Godepsgo run the go tool with saved dependenciesget download and install packages with specified dependenciespath print GOPATH for dependency coderestore check out listed dependency versions in GOPATHupdate update selected packages or the go versiondiff shows the diff between current and previously saved set of dependenciesversion show version info