長期以來,golang 對外部依賴都沒有很好的管理方式,只能從 $GOPATH 下尋找依賴。這就造成不同使用者在安裝同一個項目適合可能從外部擷取到不同的依賴庫版本,同時當無法連網時,無法編譯依賴缺失的項目。
自 1.5 版本開始引入 govendor 工具,該工具將項目依賴的外部包放到項目下的 vendor 目錄下(對比 nodejs 的 node_modules 目錄),並通過 vendor.json 檔案來記錄依賴包的版本,方便使用者使用相對穩定的依賴。
對於 govendor 來說,主要存在三種位置的包:項目自身的包組織為本地(local)包;傳統的存放在 $GOPATH 下的依賴包為外部(external)依賴包;被 govendor 管理的放在 vendor 目錄下的依賴包則為 vendor 包。
具體來看,這些包可能的類型如下:
| 狀態 |
縮寫狀態 |
含義 |
| +local |
l |
當地套件,即項目自身的包組織 |
| +external |
e |
外部包,即被 $GOPATH 管理,但不在 vendor 目錄下 |
| +vendor |
v |
已被 govendor 管理,即在 vendor 目錄下 |
| +std |
s |
標準庫中的包 |
| +unused |
u |
未使用的包,即包在 vendor 目錄下,但項目並沒有用到 |
| +missing |
m |
代碼引用了依賴包,但該包並沒有找到 |
| +program |
p |
主程式包,意味著可以編譯為執行檔案 |
| +outside |
|
外部包和缺失的包 |
| +all |
|
所有的包 |
常見的命令如下,格式為 govendor COMMAND。
通過指定包類型,可以過濾僅對指定包進行操作。
| 命令 |
功能 |
| 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 目錄 |