Go 包依賴管理工具 —— govendor

2021-02-20 51reboot運維開發

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


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

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

在發布 1.6 版本時,該環境變量的值已經默認設置為 1 了,該值可以使用 go env 命令查看。

在發布 1.7 版本時,已去掉該環境變量,默認開啟 vendor 特性。


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


要求: - 項目必須在 $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 初始化:

項目根目錄下即會自動生成 vendor 目錄和 vendor.json 文件。此時 vendor.json 文件內容為:

{  "comment": "",  "ignore": "test",  "package": [],  "rootPath": "govendor-example"}

常用命令
govendor add gopkg.in/yaml.v2

 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.v2pl  govendor-example  m github.com/json-iterator/go  m golang.org/x/sys/unix

 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.v2pl  govendor-example  m github.com/json-iterator/go  m golang.org/x/sys/unix

 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

govendor fetch golang.org/x/net/context

govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55govendor fetch golang.org/x/net/context@v1   govendor fetch golang.org/x/net/context@=v1  

govendor install +vendor,^program

govendor update -uncommitted <updated-package-import-path>

govendor fetch github.com/normal/pkg::github.com/myfork/pkg

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


各子命令詳細用法可通過 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列出所有依賴包的 LICENSEshell可一次性運行多個 govendor 命令狀態縮寫含義+locall本地包,即項目內部編寫的包+externale外部包,即在 GOPATH 中、卻不在項目 vendor 目錄+vendorv已在 vendor 目錄下的包+stds標準庫裡的包+excludedx明確被排除的外部包+unusedu未使用的包,即在 vendor 目錄下,但項目中並未引用到+missingm被引用了但卻找不到的包+programp主程序包,即可被編譯為執行文件的包+outside
相當於狀態為 +external +missing+all
所有包

支持狀態參數的子命令有:list、add、update、remove、fetch


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

目前已受到社區的看好和強烈推薦,建議新項目採用 Go modules。


govendor 項目

golang使用vendor目錄來管理依賴包

Golang包管理工具之govendor的使用

出處:http://u6.gg/sDe3r

Golang零基礎入門課程

本課程為:網絡班

6.15正式開班上課


golang 課程 6 月15 日開課,想要學習的小夥伴可以掃碼諮詢

添加小助手WeChat:17812796384


相關焦點

  • 小白都能看懂的go語言包管理工具"DEP"詳解
    簡介眾所周知GO語言包管理工具百花齊放,前有godep、glide、govendor,後有dep。
  • 項目改用GoModules管理依賴的方法和經驗總結
    Go語言官方提供的依賴包管理工具已經發布很久了,有很多大佬的文章對Go Modules做了非常詳盡的介紹,比如煎魚大佬的: Go Modules終極入門(文章連結:https://juejin.cn/post/6844903433846145038)。
  • Go 指南:頂級 Go 框架、IDE 和工具列表
    它還可以用於工具,構建流程,linters,vet 和 coverage 工具。Go-plus 還包括各種代碼片段和功能,如 gocode 的自動完成,gofmt、goreturns 或 goimports 等的代碼格式化。
  • Go 包管理歷史以及 Go mod 使用
    之前也寫過 Go 管理依賴工具 godep 的使用,當時看 godep 使用起來還是挺方便,其原因主要在於有總比沒有強。關於依賴管理工具其實還是想從頭聊聊這個需求以及大家做這個功能的各種出發點。針對 Go 官方對包管理的亂象無動於衷,社區的同學們實在是忍無可忍,相繼開源了各種包管理工具。13 年的時候 Godep 誕生,原理很簡單,跟 maven 一樣,指定一個統一的包管理目錄,將這個目錄作為唯一的 GOPATH。
  • Go Gin 系列一:Go 介紹與環境安裝
    了解 Go Modules了解歷史在過去,Go 的依賴包管理在工具上混亂且不統一,有 dep,有 glide,有 govendor...甚至還有因為外網的問題,頻頻導致拉不下來包,很多人苦不堪言,盼著官方給出一個大一統做出表率。
  • 煎魚 Go Gin 系列一:Go 介紹與環境安裝
    了解 Go Modules了解歷史在過去,Go 的依賴包管理在工具上混亂且不統一,有 dep,有 glide,有 govendor...甚至還有因為外網的問題,頻頻導致拉不下來包,很多人苦不堪言,盼著官方給出一個大一統做出表率。
  • 聊聊 Python 中的依賴管理工具
    某篇教程可能用的是這個工具,另一篇教程又可能是那個工具,還有的教程可能幾個工具都在用。看了幾篇後,整個人都懵了,這些工具各自都是幹嘛的啊?就算最後環境弄好了,估計心裡還在犯嘀咕,這些有什麼區別和聯繫呢?好了,本篇文章就帶你捋捋常見的一些包、環境管理工具,讓你對這些工具有個相對清晰的認知。
  • golang 依賴管理之 mod
    很早就考慮了依賴管理的問題,內置 go get 命令,可以直接獲取對應的依賴,非常方便,但是有一個巨大的缺陷,沒有版本的維護和管理,而版本不一致可能會導致各種兼容性問題,因此出現了很多第三方依賴管理工具,dep 和 glide 就是其中的佼佼者,到了 go 1.11 官方終於推出了自己的依賴管理工具 mod,並內置在 go 版本中,go mod 使用簡單,功能強大,並且能自動兼容大多數之前的第三方工具
  • Helm:強大的Kubernetes包管理工具
    用戶通過使用Kubernetes API對象來描述應用程式規格,包括Pod,Service,Volume,Namespace,ReplicaSet,Deployment,Job等等。一般這些對象需要寫入一系列的Yaml文件中,然後通過Kubernetes命令行工具Kubectl進行部署。
  • 用Go語言編程的利與弊
    這允許你解耦代碼中的依賴項。然後,你可以在測試中模擬你的依賴項。通過使用接口,你可以編寫更加模塊化的可測試代碼。Go 語言還具有頭等函數,這使得開發人員以更實用的方式編寫代碼成為可能。Go 語言有一個相當不錯的標準庫。它提供了方便的內置函數,用於處理基本類型。有些包可以讓你輕鬆構建一個 Web 伺服器、處理 I/O、使用加密技術以及操作原始字節。
  • 用Go語言進行編程的利與弊
    這允許你解耦代碼中的依賴項。然後,你可以在測試中模擬你的依賴項。通過使用接口,你可以編寫更加模塊化的可測試代碼。Go 語言還具有頭等函數,這使得開發人員以更實用的方式編寫代碼成為可能。Go 語言有一個相當不錯的標準庫。它提供了方便的內置函數,用於處理基本類型。有些包可以讓你輕鬆構建一個 Web 伺服器、處理 I/O、使用加密技術以及操作原始字節。
  • 包管理工具yarn
    yarn是facebook發布的一款取代npm的資源包管理工具,是一個快速、可靠、安全的依賴管理工具,一款新的node資源包管理工具。
  • 如何用 GVM 管理 Go 項目 | Linux 中國
    Go 語言版本管理器(GVM)是管理 Go 語言環境的開源工具。GVM 「pkgsets」 支持安裝多個版本的 Go 並管理每個項目的模塊。它最初由 Josh Bussdieker 開發,GVM(像它的對手 Ruby RVM 一樣)允許你為每個項目或一組項目創建一個開發環境,分離不同的 Go 版本和包依賴關係,以提供更大的靈活性,防止不同版本造成的問題。
  • Go 項目推薦之喜歡 yarn 交互模式更新依賴的 gopher 有福了
    使用過 yarn 的朋友,應該知道 yarn upgrade-interactive,用於交互式更新依賴。
  • 面試題:如何更新 Go Module 項目的依賴 — 解決問題的方法很重要
    因此如果需要更新所有直接依賴的版本,需要先找出所有的直接依賴,根據以上結構加上 text/template 模板的語法,可以寫出如下命令:go list -m -f '{{if not (or .Main .Indirect)}}{{.Path}}{{end}}' all
  • 我做了一個Go語言的微服務工具包
    為了表達我對這種語言的熱愛,我開發了一個工具包,以幫助希望使用 Go 來增強微服務的其他開發人員。微服務通常由 HTTP 或 RPC 框架(如 REST 和 gRPC)支持。REST 來自於人們熟悉的面向實體(entry) 設計——設計方法是 HTTP 協議的一 構建塊。CRUD(Create、Read、Update、Delete)操作定義了實體的一組行為。
  • 源自Babel的多包管理工具:Lerna
    被依賴的模塊版本升級,模塊其他版本需要手動管理相關的版本。有循環依賴的風險對於多個模塊的大型項目的協作管理,一般地有multirepo、monorepo和submodules等多種方式:multirepo是將多個模塊分別分為多個倉庫,早期的Babel(Babel6以前)使用的就是這種方式;submodules是藉助git的實現,在.gitmodules中寫明引用的倉庫,在主倉庫中只保留必要的索引;monorepo則是將相關的模塊用單一的倉庫統一管理
  • Windows 也有包管理工具?
    在 Win 環境下,我們手動安裝一款軟體的流程是:之前只有 MacOS 和 Linux 官方才有軟體包管理工具,其實微軟官方也為 Windows 系統發布了一款名為 Winget 的軟體包管理工具。雖然在 Windows 平臺已經有 scoop 和 chocolately 這樣的包管理工具,但畢竟 WinGet 是微軟親兒子,而且在不斷更新中。現在 Winget 還處於開發預覽階段,項目託管在 GitHub 上。同時,微軟還在 GitHub 上維護著 winget-pkgs 倉庫。
  • 基於 gorilla/sessions 在 Go 語言中管理 Session
    Go 語言官方提供的 http 包雖然對 HTTP 編程提供了豐富的 API,但是沒有提供官方的 Session 實現。如果在 Web 應用中使用到了 Session,需要自行去實現(就像在線論壇這個入門項目中所做的那樣),或者使用第三方工具包,比如 gorilla/sessions,這裡我們以後者為例演示如何通過它在 Go Web 應用中啟動和管理 Session。
  • golang依賴注入工具wire指南
    wire與依賴注入 Wire 是一個的Golang依賴注入工具,通過自動生成代碼的方式在編譯期完成依賴注入,Java體系中最出名的Spring框架採用運行時注入,個人認為這是wire和其他依賴注入最大的不同之處。