Golang官方依賴管理工具dep學習使用筆記
golang的之前的版本一直缺乏官方的包管理,第三方的包管理個人感覺還是比較麻煩的,但是看到dep現在樣子之後還是有了很大的興趣,使用了之後發現也確實方便了很多。推薦使用dep
Golang官方依賴管理工具:dep
今天在看一個內部專案的時候發現內部一個專案的體積非常大,一看原來是vendor佔了很大空間。裡面的庫都是靜態提交到git庫的,更新和管理都很不方便,想想java開發中的maven多好用啊。之前也知道golang一直在開發類似的東西,借這個機會了解了一下,golang也已經有了這樣的工具了:godep。所以趕緊拿來研究一下看看怎麼用起來,用了之後發現,哎,還挺好用的。管理起來非常便捷,不過要吐槽的還是公司的網路環境,好蛋疼啊!
godep是Golang官方的庫依賴管理工具,用來管理和下載專案中依賴的庫,從目前使用來說,還是比較好的,在分支,版本的控制上都還不錯,就是它的配置檔案感覺有點原始。下面是是官方對這個工具的介紹。
dep is a prototype dependency management tool for Go. It requires Go 1.9 or newer to compile. dep is safe for production use.
接下來我們就看看怎麼使用這個工具,先從簡單的來。
安裝dep
go get -u github.com/golang/dep/cmd/dep
一般是安裝在這個地方:
# $GOPATH/bin/dep.exe
測試
$ dep Dep is a tool for managing dependencies for Go projects Usage: "dep [command]" Commands: initSet up a new Go project, or migrate an existing one statusReport the status of the project's dependencies ensureEnsure a dependency is safely vendored in the project versionShow the dep version information checkCheck if imports, Gopkg.toml, and Gopkg.lock are in sync Examples: dep initset up a new project dep ensureinstall the project's dependencies dep ensure -updateupdate the locked versions of all dependencies dep ensure -add github.com/pkg/errorsadd a dependency to the project Use "dep help [command]" for more information about a command. helightxu@helightxu-NB0 MINGW64 /d/code_dev/src/godepmod
使用
在$GOPATH/src下建立專案,比如godepdemo,進入資料夾
cd $GOPATH/src/godepdemo
初始化目錄
helightxu@helightxu-NB0 MINGW64 /d/code_dev/src/godepdemo $ dep init helightxu@helightxu-NB0 MINGW64 /d/code_dev/src/godepdemo $ ls Gopkg.lockGopkg.tomlvendor
這裡生成了2個檔案和一個資料夾。
vendor應該都不陌生了,vendor 目錄是 golang1.5 以後依賴管理目錄,類似node中的node_module目錄。其實在最新版本的go中已經可以廢棄了,尤其適用了dep管理依賴之後,不過也相容,目前還是優先使用vendor目錄中的依賴庫,這個目錄的依賴程式碼是優先載入的。
Gopkg.toml簡單講是依賴庫的清單檔案,Gopkg.lock是校驗描述檔案。Gopkg.toml 是依賴管理的核心檔案,可以生成也可以手動修改, Gopkg.toml 官方文件
Gopkg.lock 是生成的檔案,不要手工修改 Gopkg.lock 官方文件
下面我們在Gopkg.toml檔案中新增依賴庫測試一下,這裡以試用gin庫為例來做一個測試。
Gopkg.toml的內容
# Gopkg.toml example # # Refer to https://golang.github.io/dep/docs/Gopkg.toml.html # for detailed Gopkg.toml documentation. # # required = ["github.com/user/thing/cmd/thing"] # ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] # # [[constraint]] #name = "github.com/user/project" #version = "1.0.0" # # [[constraint]] #name = "github.com/user/project2" #branch = "dev" #source = "github.com/myfork/project2" # # [[override]] #name = "github.com/x/y" #version = "2.4.0" # # [prune] #non-go = false #go-tests = true #unused-packages = true [[constraint]] name = "github.com/gin-gonic/gin" version = "v1.3.0" [[constraint]] name = "github.com/cihub/seelog" version = "v2.6" [prune] go-tests = true unused-packages = true
再來寫一個測試程式
main.go
package main import ( "github.com/gin-gonic/gin" "github.com/cihub/seelog" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) seelog.Info("app run ") r.Run() // listen and serve on 0.0.0.0:8080 seelog.Info("app over") }
更新試用
helightxu@helightxu-NB0 MINGW64 /d/code_dev/src/godepdemo $ dep ensure helightxu@helightxu-NB0 MINGW64 /d/code_dev/src/godepdemo $ go run main.go
常用命令和一些問題
dep init
初始化專案,主要是生成Gopkg.lock,Gopkg.toml,vendor這三個檔案。
dep status
用來檢視專案依賴的詳細資訊和狀態,非常清晰,
$ dep status PROJECTCONSTRAINTVERSIONREVISIONLATESTPKGS USED github.com/cihub/seelog^2.6.0v2.6d2c6e5av2.61 github.com/gin-contrib/ssebranch masterbranch master22d885f22d885f1 github.com/gin-gonic/gin^1.3.0v1.3.0b869fe1v1.3.04 github.com/golang/protobufv1.2.0v1.2.0aa810b6v1.2.01 github.com/json-iterator/gov1.1.5v1.1.51624edcv1.1.51 github.com/mattn/go-isattyv0.0.4v0.0.46ca4dbfv0.0.41 github.com/modern-go/concurrent1.0.31.0.3bacd9c71.0.31 github.com/modern-go/reflect21.0.11.0.14b7aa431.0.11 github.com/ugorji/gov1.1.1v1.1.1b4c50a2v1.1.11
CONSTRAINT為Gopkg.toml中限定的版本;
VERSION為當前vendor中的版本;
REVISION為當前vendor中的修訂號;
LATEST為CONSTRAINT限定下github中能滿足要求的最新版本。
dep ensure
用來同步包的配置檔案和引入的包,建議使用的時候加上’-v’引數
dep ensure -v
嘗試確保所有的依賴庫都已經安裝,如果沒有即下載,相當於對依賴庫做增量更新。修改Gopkg.toml中的CONSTRAINT,若使得LATEST低於當前vendor中的版本,則執行dep ensure後,vendor中的版本降低到能滿足要求的最新版本;若使得LATEST高於vendor中的版本,則執行dep ensure後,vendor中的版本不變,可使用dep ensure -update更新vendor到LATEST版本。
dep prune -v
刪除沒有用到的 package
dep help ensure
依賴管理幫助
dep ensure -add github.com/cihub/seelog
新增一條依賴
dep ensure -add github.com/cihub/seelog@=2.6.0
這裡 @= 引數指定的是 某個 tag
dep ensure
新增後一定記住執行 確保 同步
dep ensure -update -v
更新依賴
本地快取
當然dep不會每次都去下載,其工作原理和Mevan一樣,會優先在本地倉庫搜尋,本地倉庫未找到即在網路上下載,並新增到本地倉庫。下面是dep儲存本地庫的路勁。
$GOPATH/pkg/dep/sources
總結
這種方式來管理依賴包,還是比較方便的。在我測試的過程中一氣呵成,沒有任何阻礙,整體感覺非常流暢也很好用,和maven的管理比較類似。
感覺有意思?來鼓勵一下!
