Govendor 是用於管理 Go 項目依賴包的工具,是基於 vendor 實現的。
一 Go 依賴包查找順序
- 當前目錄下的 vendor 目錄
- 上級目錄下的 vendor 目錄,直到 src 目錄下的 vendor 目錄
- ${GOPATH}/src 目錄
- ${GOROOT} 目錄
二 使用前提
- 項目必須在 ${GOPATH}/src 目錄下。
- Go 1.5 版本確保設置環境變量:
GO15VENDOREXPERIMENT=1
.
三 安裝
-
執行:
go get -u github.com/kardianos/govendor
-
將 ${GOPATH}/bin 配到 PATH 中:
export PATH = $PATH: $GOPATH/bin
四 初始化
進入項目根目錄,執行:govendor init
.
然後,項目根目錄下會自動生成一個 vendor 目錄,目錄下有一個 vendor.json
文件,用於依賴包更新記錄。
{
"comment": "",
"ignore": "test",
"package": [],
"rootPath": "project-root"
}
五 命令示例
# 將被項目引用的、且已存在於 $GOPATH 中的包複製到 vendor 目錄
govendor add +external
# 列出項目依賴的包及包的 status
govendor list
# 列出哪些包使用了 fmt 包
govendor list -v fmt
# 從遠程倉庫直接添加或更新包到 vendor 目錄(不會複製到 $GOPATH)
govendor fetch golang.org/x/net/context
# 從遠程倉庫直接添加或更新包到 vendor 目錄,指定版本或修訂版
govendor fetch golang.org/x/net/context@a4bbc9 # context 包的修訂版 a4bbc9
govendor fetch golang.org/x/net/context@v1 # 最新的 v1 tag:v1.*.*
govendor fetch golang.org/x/net/context@=v1 # 就是 'v1' tag
# 僅格式化項目代碼
govendor fmt +local
# 僅構建編譯項目代碼
govendor install +local
# 僅測試項目的測試用例
govendor test +local
六 子命令
Govendor 子命令 | 說明 |
---|---|
init | govendor 初始化,創建 vendor 目錄及其下 vendor.json 文件 |
list | 列出依賴包的及其 status |
add | 添加 $GOPATH 中依賴包到 vendor 目錄 |
update | 更新 $GOPATH 中依賴包到 vendor 目錄 |
remove | 移除 vendor 目錄依賴包 |
status | 列出本地所有缺失、過期、修改過的包 |
fetch | 添加或更新遠程倉庫的包到 vendor 目錄 |
sync | 從遠程倉庫拉去與 vendor.json 文件最新記錄的包到 vendor 目錄 |
migrate | 從其他基於 vendor 實現的包管理工具中一鍵遷移依賴包 |
get | 與 go get 類似,將包下載到 $GOPATH ,再複製到 vendor 目錄 |
license | 列出所有依賴包的 LICENSE |
shell | 可一次性運行多個 govendor 命令 |
七 包狀態
status | 簡稱 | 說明 |
---|---|---|
+local | l | 項目內編寫的包 |
+external | e, ext | 項目引用的包,不在項目內,但是在 $GOPATH 內 |
+vendor | v | vendor 目錄中的包 |
+std | s | 標準庫中的包 |
+excluded | x, exc | 被明確排除在 vendor 外的 external 包 |
+unused | u | 在 vendor 中,但未被項目引用的包 |
+missing | m | 被項目引用,卻找不到的包 |
+program | p | 可被編譯成執行文件的主程序包 |
+outside | 或 external 包、或 missing 包 |
|
+all | 所有包 |
Status 可以組合使用
+local, program
: local AND program 包+local +vendor
: local OR vendor 包+vendor, program +std
: (vendor AND program) OR std 包+vendpr ^program
: vendor AND NOT program 包
八 包限定符
github.com/kardianos/govendor
: 指定單個包和單個文件夾github.com/kardianos/govendor/...
: 指定 govendor 和該路徑下所有被引用的包github.com/kardianos/govendor/^
: 指定 govendor 和所有子文件夾github.com/kardianos/govendor/^::github.com/myself/govendor
: 和上條類似,但取自用戶 ‘myself’github.com/kardianos/govendor/...@abc12032
: 所有被引用的包,修訂版abc12032github.com/kardianos/govendor/...@v1
: 所有被引用的包,取最新v1 tag,如v1.4.3github.com/kardianos/govendor/...@=v1
: 所有被引用的包,就取v1
可以使用 status 和包限定符的子命令:
- list
- add
- update
- remove
- fetch
參考鏈接
https://github.com/kardianos/govendor
https://shockerli.net/post/go-package-manage-tool-govendor/