Go 包依賴管理工具 govendor

2021-10-01 14:06:16 字數 4747 閱讀 4081

govendor 是乙個基於 vendor 機制實現的 go 包依賴管理命令列工具。與原生 vendor 無侵入性融合,也支援從其他依賴管理工具遷移,可以很方便的實現同乙個包在不同專案中不同版本、以及無相互侵入的開發和管理。

vendor 特性

最開始的時候,go 並沒有提供較為妥當的包管理工具。從 1.5 版本開始提供了 vendor 特性,但需要手動設定環境變數 go15vendorexperiment=1。

在執行 go build 或 go run 命令時,會按照以下順序去查詢包:

當前包下的 vendor 目錄

向上級目錄查詢,直到找到 src 下的 vendor 目錄

在 goroot 目錄下查詢

在 gopath 下面查詢依賴包

在發布 1.6 版本時,該環境變數的值已經預設設定為 1 了,該值可以使用 go env 命令檢視。

在發布 1.7 版本時,已去掉該環境變數,預設開啟 vendor 特性。

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(必須指定乙個路徑)

govendor 使用

要求:專案必須在 $gopath/src 目錄下

如果 go 版本為 1.5,則必須手動設定環境變數 set go15vendorexperiment=1

安裝go get -u github.com/kardianos/govendor

為了方便快捷使用 govendor,建議將 $gopath/bin 新增到 path 中。linux/macos 如下設定:

export path="$gopath/bin:$path"

初始化在專案根目錄下執行以下命令進行 vendor 初始化:

govendor init

專案根目錄下即會自動生成 vendor 目錄和 vendor.json 檔案。此時 vendor.json 檔案內容為:

常用命令

將已被引用且在 $gopath 下的所有包複製到 vendor 目錄

govendor add +external

僅從 $gopath 中複製指定包

govendor add gopkg.in/yaml.v2

列出**中所有被引用到的包及其狀態

列出乙個包被哪些包引用

從遠端倉庫新增或更新某個包(不會在 $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 fork 了某個包,但尚未合併,該如何引用到最新的**包

此時將從 myfork 拉取**,而不是 normal。

vendor.json 中記錄了依賴包資訊,該如何拉取更新

govendor sync

govendor 子命令

各子命令詳細用法可通過 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 實現的包管理工具中一鍵遷移

license 列出所有依賴包的 license

shell 可一次性執行多個 govendor 命令

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 modules

普大喜奔的是,從 go 1.11 版本開始,官方已內建了更為強大的 go modules 來一統多年來 go 包依賴管理混亂的局面(go 官方之前推出的 dep 工具也幾乎胎死腹中),並且將在 1.12 版本中正式預設開啟。

目前已受到社群的看好和強烈推薦,建議新專案採用 go modules。

Go 包依賴管理工具 govendor

govendor 是乙個基於vendor機制實現的 go 包依賴管理命令列工具。與原生 vendor 無侵入性融合,也支援從其他依賴管理工具遷移,可以很方便的實現同乙個包在不同專案中不同版本 以及無相互侵入的開發和管理。最開始的時候,go 並沒有提供較為妥當的包管理工具。從 1.5 版本開始提供了 ...

Go依賴管理工具(三)govendor

安裝方法 go get u github.com kardianos govendor用法 govendor init 初始化 vendor 目錄,生成乙個初始化的vendor.json govendor add local 加本專案中用到的dependency加到vendor.json裡面 gov...

Golang 依賴管理工具

使用 vendor 目錄 go module proxy go vendor depgo mod 使用 再探go modules 使用與細節 go的包管理工具 三 go modules go的包管理工具 四 go module proxy go 模組解惑 到處都是 go111module 這到底什麼...