govendor 是一個基於
vendor
機制實現的 Go 包依賴管理命令行工具。與原生 vendor 無侵入性融合,也支持從其餘依賴管理工具遷移,能夠很方便的實現同一個包在不一樣項目中不一樣版本、以及無相互侵入的開發和管理。
最開始的時候,Go 並無提供較爲穩當的包管理工具。從 1.5 版本開始提供了 vendor 特性,但須要手動設置環境變量 GO15VENDOREXPERIMENT=1
。html
在執行 go build
或 go run
命令時,會按照如下順序去查找包:git
在發佈 1.6 版本時,該環境變量的值已經默認設置爲 1 了,該值可使用 go env
命令查看。github
在發佈 1.7 版本時,已去掉該環境變量,默認開啓 vendor
特性。golang
main
的 package
)不該該在本身的版本控制中存儲外部的包在 vendor
目錄中,除非有特殊緣由而且知道爲何要這麼作。main
的 package
),建議只有一個 vendor
目錄,且在代碼庫一級目錄。govendor 是一個基於 vendor
目錄機制的包管理工具。shell
$GOPATH
複製到項目的 vendor
目錄下vendor/vendor.json
進行包和版本管理,這點與 PHP 的 Composer
相似govendor add/update
命令從 $GOPATH
中複製依賴包vendor/*/
文件,可用 govendor sync
恢復依賴包govendor fetch
添加或更新依賴包govendor migrate
從其餘 vendor
包管理工具中一鍵遷移到 govendor
要求:json
$GOPATH/src
目錄下set GO15VENDOREXPERIMENT=1
go get -u github.com/kardianos/govendor
爲了方便快捷使用 govendor
,建議將 $GOPATH/bin
添加到 PATH 中。Linux/macOS 以下設置:segmentfault
export PATH="$GOPATH/bin:$PATH"
在項目根目錄下執行如下命令進行 vendor
初始化:ide
govendor init
項目根目錄下即會自動生成 vendor
目錄和 vendor.json
文件。此時 vendor.json
文件內容爲:工具
{ "comment": "", "ignore": "test", "package": [], "rootPath": "govendor-example" }
$GOPATH
下的全部包複製到 vendor
目錄govendor add +external
$GOPATH
中複製指定包govendor add gopkg.in/yaml.v2
govendor list
e github.com/gin-contrib/sse e github.com/gin-gonic/gin e github.com/gin-gonic/gin/binding e github.com/gin-gonic/gin/internal/json e github.com/gin-gonic/gin/render e github.com/golang/protobuf/proto e github.com/mattn/go-isatty e github.com/ugorji/go/codec e gopkg.in/go-playground/validator.v8 e gopkg.in/yaml.v2 pl govendor-example m github.com/json-iterator/go m golang.org/x/sys/unix
govendor list -v fmt
s fmt ├── e github.com/gin-contrib/sse ├── e github.com/gin-gonic/gin ├── e github.com/gin-gonic/gin/render ├── e github.com/golang/protobuf/proto ├── e github.com/ugorji/go/codec ├── e gopkg.in/go-playground/validator.v8 ├── e gopkg.in/yaml.v2 └── pl govendor-example
$GOPATH
也存一份)govendor fetch golang.org/x/net/context
govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55 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".
vendor
目錄下的不變更)govendor fmt +local
govendor install +local
govendor test +local
vendor
包govendor install +vendor,^program
vendor
目錄(包括 $GOPATH
存在或不存在的包)govendor fetch +out
vendor
目錄,但想從 $GOPATH
更新govendor update +vendor
$GOPATH
裏的某個包,如今想將已修改且未提交的包更新到 vendor
govendor update -uncommitted <updated-package-import-path>
govendor fetch github.com/normal/pkg::github.com/myfork/pkg
此時將從 myfork
拉取代碼,而不是 normal
。post
vendor.json
中記錄了依賴包信息,該如何拉取更新govendor sync
各子命令詳細用法可經過 govendor COMMAND -h
或閱讀 github.com/kardianos/govendor/context
查看源碼包如何實現的。
子命令 | 功能 |
---|---|
init | 建立 vendor 目錄和 vendor.json 文件 |
list | 列出&過濾依賴包及其狀態 |
add | 從 $GOPATH 複製包到項目 vendor 目錄 |
update | 從 $GOPATH 更新依賴包到項目 vendor 目錄 |
remove | 從 vendor 目錄移除依賴的包 |
status | 列出全部缺失、過時和修改過的包 |
fetch | 從遠程倉庫添加或更新包到項目 vendor 目錄(不會存儲到 $GOPATH ) |
sync | 根據 vendor.json 拉取相匹配的包到 vendor 目錄 |
migrate | 從其餘基於 vendor 實現的包管理工具中一鍵遷移 |
get | 與 go get 相似,將包下載到 $GOPATH ,再將依賴包複製到 vendor 目錄 |
license | 列出全部依賴包的 LICENSE |
shell | 可一次性運行多個 govendor 命令 |
狀態 | 縮寫 | 含義 |
---|---|---|
+local | l | 本地包,即項目內部編寫的包 |
+external | e | 外部包,即在 GOPATH 中、卻不在項目 vendor 目錄 |
+vendor | v | 已在 vendor 目錄下的包 |
+std | s | 標準庫裏的包 |
+excluded | x | 明確被排除的外部包 |
+unused | u | 未使用的包,即在 vendor 目錄下,但項目中並未引用到 |
+missing | m | 被引用了但卻找不到的包 |
+program | p | 主程序包,便可被編譯爲執行文件的包 |
+outside | 至關於狀態爲 +external +missing |
|
+all | 全部包 |
支持狀態參數的子命令有:list
、add
、update
、remove
、fetch
普大喜奔的是,從 Go 1.11 版本開始,官方已內置了更爲強大的 Go modules 來一統多年來 Go 包依賴管理混亂的局面(Go 官方以前推出的 dep 工具也幾乎胎死腹中),而且將在 1.13 版本中正式默認開啓。
目前已受到社區的看好和強烈推薦,建議新項目採用 Go modules。
感謝您的閱讀,以爲內容不錯,點個贊吧 😆
原文地址: https://shockerli.net/post/go...