包管理工具govendor
一、go找包邏輯
在執行 go build
或 go run
命令時,會按照以下順序去查找包:
- 當前包下的
vendor
目錄 - 向上級目錄查找,直到找到
src
下的vendor
目錄 - 在
GOROOT
目錄下查找 - 在
GOPATH
下面查找依賴包
二、vendor使用建議
- 一個庫工程(不包含
main
的package
)不應該在自己的版本控制中存儲外部的包在vendor
目錄中,除非有特殊原因並且知道爲什麼要這麼做。 - 在一個應用中,(包含
main
的package
),建議只有一個vendor
目錄,且在代碼庫一級目錄。
三、govendor 簡介
govendor 是一個基於 vendor 目錄機制的包管理工具。
- 支持從項目源碼中分析出依賴的包,並從
$GOPATH
複製到項目的vendor
目錄下 - 支持包的指定版本,並用
vendor/vendor.json
進行包和版本管理,這點與 PHP 的Composer
類似 - 支持用
govendor add/update
命令從$GOPATH
中複製依賴包 - 如果忽略了
vendor/*/
文件,可用govendor sync
恢復依賴包 - 可直接用
govendor fetch
添加或更新依賴包 - 可用
govendor migrate
從其他vendor
包管理工具中一鍵遷移到govendor
- 支持
Linux
,macOS
,Windows
,甚至現有所有操作系統 - 支持
Git
、Hg
、SVN
,BZR
(必須指定一個路徑)
go
中所有的project代碼都要放在GoPATH
下的src
目錄下,因而會存在全局GoPATH
和項目的GoPATH
。本地開發,可以直接都放在全局的GoPATH
下,然後每個項目用govendor
的方式添加相關依賴包
我們可以直接在命令行輸入如下命令
go get -u github.com/kardianos/govendor
進行安裝
接着使用一套連招:
govendor init # 創建vendor目錄,創建vendor.json文件
govendor add +external #生成依賴包(添加外部包,不包含項目代碼)
govendor update +vendor # 更新vendor的包命令
命令解析:
狀態 | 縮寫狀態 | 含義 |
---|---|---|
+local |
l | 本地包,即項目自身的包組織 |
+external |
e | 外部包,即被 $GOPATH 管理,但不在 vendor 目錄下 |
+vendor |
v | 已被 govendor 管理,即在 vendor 目錄下 |
+std |
s | 標準庫中的包 |
+unused |
u | 未使用的包,即包在 vendor 目錄下,但項目並沒有用到 |
+missing |
m | 代碼引用了依賴包,但該包並沒有找到 |
+program |
p | 主程序包,意味着可以編譯爲執行文件 |
+outside |
外部包和缺失的包 | |
+all |
所有的包 |
命令 | 功能 |
---|---|
init |
初始化 vendor 目錄 |
list |
列出所有的依賴包 |
add |
添加包到 vendor 目錄,如 govendor add +external 添加所有外部包 |
add PKG_PATH |
添加指定的依賴包到 vendor 目錄 |
update |
從 $GOPATH 更新依賴包到 vendor 目錄 |
remove |
從 vendor 管理中刪除依賴 |
status |
列出所有缺失、過期和修改過的包 |
fetch |
添加或更新包到本地 vendor 目錄 |
sync |
本地存在 vendor.json 時候拉去依賴包,匹配所記錄的版本 |
get |
類似 go get 目錄,拉取依賴包到 vendor 目錄 |
命令舉例:
govendor add +local #會將本地的項目包(代碼)也添加到vendor目錄下
# 拉取最新包(指定版本,按版本拉,不指定按最新拉)
govendor fetch github.com/astaxie/beego@=v1.10.0
# 同步依賴包(如果某個包誤刪,verdor.json存在即可依其進行拉取)
govendor sync