dep golang 包管理使用記錄
dep 是 golang 項目依賴管理之一,是官方的實驗項目,目前更新很頻繁處於高速發展期,所以選 dep 作為 golang 的依賴管理器是比較靠譜的。(已知 glide 僅支援不再開發新功能)
目前 dep v0.5.0 release 已經發布,最新的 changelog 顯示只支援 golang 1.9+ 以上的版本
golang 最原始的依賴管理是 go get ,執行命令後會拉取代碼放入 src 下面,但是它是作為 GOPATH 下全域的依賴,並且 go get 還不能版本控制,以及隔離項目的包依賴在沒有依賴管理工具的時候,golang 項目有一種目錄結構比較流行如下:
.└── src ├── demo │ └── main.go ├── github.com ├── golang.org └── gopkg.in
這樣做的話就是每一個項目一個 GOPATH 則上面的 GOPATH=/xx/xx/src 這樣設定後也是可以編譯的,且項目依賴都是 src 下的包,與全域的無關聯, go get
擷取依賴,也必須在項目 GOPATH 下。可以看到這樣的目錄結構還是有很多缺陷的。特別是 import 包的包目錄有時會很奇怪,沒有統一的風格,且 ide 或 編輯器支援也不夠理想。
所以目前 golang 引入了 vendor 目錄作為依賴管理目錄,且 ide 或 golang 編輯外掛程式目前都能很好的支援 例如 gogland 索引依賴包時會優先尋找項目根目錄下的 vendor 目錄, vscode 的 go 外掛程式也是。那麼目前比較流行的目錄結構如下:
.├── Gopkg.lock├── Gopkg.toml├── main.go└── vendor ├── github.com │ ├── gin-contrib │ ├── gin-gonic │ ├── golang │ ├── mattn │ └── ugorji ├── golang.org │ └── x └── gopkg.in ├── go-playground └── yaml.v2
項目目錄 $GOPATH/src/projectname/.
Getting Started
install / uninstall
macOS
brew install depbrew uninstall dep# /usr/local/bin/dep
windows
# 推薦 go get 安裝go get -u github.com/golang/dep/cmd/dep# $GOPATH/bin/dep.exe
Arch linux
pacman -S dep# 刪除 pacman -R dep
二進位安裝
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh# $GOPATH/bin/dep# 刪除 > rm $GOPATH/bin/dep
源碼安裝
go get -d -u github.com/golang/depcd $(go env GOPATH)/src/github.com/golang/depDEP_LATEST=$(git describe --abbrev=0 --tags)git checkout $DEP_LATESTgo install -ldflags="-X main.version=$DEP_LATEST" ./cmd/depgit checkout master
推薦安裝方式為 各系統的快捷安裝,最方便且不容易出錯, 如果想使用最新/指定版本,推薦源碼安裝
初始化項目
推薦使用上述第二種目錄結構
mkdir $GOPATH/src/examplecd $GOPATH/src/exampledep init# 產生 vendor/ 目錄下 Gopkg.toml Gopkg.lock
使用流程
Usage
Dep is a tool for managing dependencies for Go projectsUsage: "dep [command]"Commands: init Set up a new Go project, or migrate an existing one status Report the status of the project's dependencies ensure Ensure a dependency is safely vendored in the project prune Pruning is now performed automatically by dep ensure. version Show the dep version informationExamples: dep init set up a new project dep ensure install the project's dependencies dep ensure -update update the locked versions of all dependencies dep ensure -add github.com/pkg/errors add a dependency to the projectUse "dep help [command]" for more information about a command.
擷取依賴策略
dep ensure -add github.com/gin-gonic/gin
dep ensure -add github.com/gin-gonic/gin@master
dep ensure -add github.com/gin-gonic/gin@V1.2
dep ensure -add github.com/gin-gonic/gin@^V1.2
dep ensure -add github.com/prometheus/client_golang/prometheus/push
擷取兩個子包的情況
dep ensure -add github.com/prometheus/client_golang/prometheus/push github.com/prometheus/client_golang/prometheus/promhttp
擷取過程:根據命令先判斷本地是否有緩衝(緩衝地址:$GOPATH/src/dep),存在則直接使用緩衝,不存在則,先擷取 git 版本/分支/tag 根據命令找到對應的版本下載。
FQAs
- 當拉取過程中如果出現 timeout 則請自備梯子.
- 當拉取出現未知的錯誤,可以先手動刪除 緩衝 在嘗試一次
- 當出現 *build.NoGoError 錯誤,可能是 build 時當前依賴包並沒有 main 函數,這種情況一般是需要拉取依賴包的子包
- 當已存在的項目 dep init 會遍曆當前項目的依賴包,並下載,所以時間會很久